选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
n n n 个记录的数组可经过 n − 1 n-1 n−1 轮选择排序得到有序结果。
算法步骤:
表现最稳定的排序算法之一,任何数据在算法中都是 Θ ( n 2 ) \Theta(n^2) Θ(n2)、 Ω ( n 2 ) \Omega(n^2) Ω(n2)、 O ( n 2 ) O(n^2) O(n2)。
不占用额外空间,故算法空间复杂度为: O ( 1 ) O(1) O(1)。
def selection_sort(array: list, reverse: bool=False) -> None:
'''
array: 支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
reverse: 是否降序, 默认采用升序。
'''
length = len(array)
for index in range(length - 1):
mind = index # 标记关键字位置
for next in range(index + 1, length): # 搜索
if (array[mind] < array[next] if reverse else array[mind] > array[next]):
mind = next
array[index], array[mind] = array[mind], array[index]
def selection_sort(array: list, reverse: bool=False) -> None:
'''
array: 支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
reverse: 是否降序, 默认采用升序。
'''
length = len(array)
scope = length // 2
for index in range(scope):
mind, maxd = index, index # 从一个方向搜索来保证单调性
for next in range(index + 1, length - index):
if (array[mind] < array[next] if reverse else array[mind] > array[next]):
mind = next
if (array[maxd] > array[next] if reverse else array[maxd] < array[next]):
maxd = next
array[mind], array[index] = array[index], array[mind]
maxd = mind if index == maxd else maxd
array[maxd], array[length - index - 1] = array[length - index - 1], array[maxd]