选择排序算法 Python
def selection_sort(arr):
"""
选择排序算法(升序)
:param arr: 待排序列表
:return: 无(原地排序)
"""
n = len(arr)
# 遍历每个位置,确定该位置应该放置的最小元素
for i in range(n):
min_idx = i # 假设当前索引 i 的元素为最小值
# 在未排序部分 [i+1, n-1] 中寻找更小的元素
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
# 将找到的最小元素与当前位置 i 交换
arr[i], arr[min_idx] = arr[min_idx], arr[i]
# 测试示例
if __name__ == "__main__":
test_array = [64, 25, 12, 22, 11]
print("原始数组:", test_array)
selection_sort(test_array)
print("排序后数组:", test_array)
# 边界测试
print("\n边界测试:")
print("空数组:", selection_sort([]) or [])
print("单元素数组:", selection_sort([1]) or [1])
print("已排序数组:", (lambda x: selection_sort(x) or x)([1, 2, 3, 4, 5]))
print("逆序数组:", (lambda x: selection_sort(x) or x)([5, 4, 3, 2, 1]))
print("含重复元素:", (lambda x: selection_sort(x) or x)([3, 1, 4, 1, 5, 9, 2, 6]))
算法说明:
· 核心思想:每次从未排序部分选出最小的元素,放到已排序部分的末尾。
· 时间复杂度:始终为 O(n²)(比较次数固定为 n(n-1)/2)。
· 空间复杂度:O(1),原地排序。
· 稳定性:不稳定(例如 [5, 3, 5, 2],第一个 5 可能被交换到最后)。
执行流程示例(对 [64, 25, 12, 22, 11]):
1. 第一轮:找到最小值 11,与 64 交换 → [11, 25, 12, 22, 64]
2. 第二轮:在 [25, 12, 22, 64] 中找到最小值 12,与 25 交换 → [11, 12, 25, 22, 64]
3. 第三轮:在 [25, 22, 64] 中找到最小值 22,与 25 交换 → [11, 12, 22, 25, 64]
4. 后续轮次已有序,完成排序。
评论 (0)
登录后可以发表评论
立即登录还没有评论,快来发表第一条评论吧!