选择排序:Python语言实现
选择排序在冒泡排序的基础上做了改进,每次遍历列表时只做一次交换。要实现这一点,选择排序在每次遍历时寻找最大值,并在遍历完之后将它放到正确位置上。和冒泡排序一样,第一次遍历后,最大的元素就位;第二次遍历后,第二大的元素就位,依此类推。若给 n 个元素排序,需要遍历 n–1 轮,这是因为最后一个元素要到 n–1 轮遍历后才就位。
下图展示了完整的选择排序过程。每一轮遍历都选择待排序元素中最大的元素,并将其放到正确位置上。第一轮放好 93,第二轮放好 77,第三轮放好 55,依此类推。
下面代码给出了选择排序函数。
def selection_sort(alist):
for fillslot in range(len(alist)-1, 0, -1):
positionOfMax = 0
for location in range(1, fillslot+1):
if alist[location] > alist[positionOfMax]:
positionOfMax = location
temp = alist[fillslot]
alist[fillslot] = alist[positionOfMax]
alist[positionOfMax] = temp
测试代码:
a_list = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(f"before sorting: {a_list}")
selection_sort(a_list)
print(f"after sorting: {a_list}")
assert a_list == sorted(a_list)
输出:
before sorting: [54, 26, 93, 17, 77, 31, 44, 55, 20]
after sorting: [17, 20, 26, 31, 44, 54, 55, 77, 93]
性能测试:
from random import randint, seed
seed(13)
lst_to_sort = [randint(100, 999) for _ in range(1000)]
%timeit selection_sort(lst_to_sort)
结果:
16.8 ms ± 111 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
可以看出,选择排序算法和冒泡排序算法的比较次数相同,所以时间复杂度也是 。
参考文档
《Python数据结构与算法分析(第2版)》:5.3.2 选择排序