选择排序:Python语言实现

66 阅读2分钟

选择排序:Python语言实现

选择排序在冒泡排序的基础上做了改进,每次遍历列表时只做一次交换。要实现这一点,选择排序在每次遍历时寻找最大值,并在遍历完之后将它放到正确位置上。和冒泡排序一样,第一次遍历后,最大的元素就位;第二次遍历后,第二大的元素就位,依此类推。若给 n 个元素排序,需要遍历 n–1 轮,这是因为最后一个元素要到 n–1 轮遍历后才就位。

下图展示了完整的选择排序过程。每一轮遍历都选择待排序元素中最大的元素,并将其放到正确位置上。第一轮放好 93,第二轮放好 77,第三轮放好 55,依此类推。

selection_sort.jpg

下面代码给出了选择排序函数。

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)

可以看出,选择排序算法和冒泡排序算法的比较次数相同,所以时间复杂度也是 O(n2)O(n^2)

参考文档

《Python数据结构与算法分析(第2版)》:5.3.2 选择排序