算法介绍
选择排序(Selection Sort)是一种简单直观的排序算法。冒泡排序每比较一次就可能交换一次,但是选择排序是将一轮比较完后,再把最小的放到最前的位置(或者把最大的放到最后)。
选择排序的流程为:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对N个元素进行排序最多交换N-1次。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
代码实现
def selectionSort(source):
# 进行n-1次选择操作
for i in range(len(source) - 1):
min = i # min存放最小值的下标,初始设为i
for j in range(i, len(source)):
if source[j] < source[min]:
min = j # 更新最小值的下标
if i != min:
#将最小值放到下标i的位置
source[min], source[i] = source[i], source[min]
return source
s = [8,6,13,7,17,1,4,5,2]
print(selectionSort(s))
# 输出:
# [1, 2, 4, 5, 6, 7, 8, 13, 17]
算法效率分析
最优时间复杂度:O(N2)
最坏时间复杂度:O(N2)
平均时间复杂度:O(N2)
空间复杂度:O(1)
稳定性: 假设a=b,且a在b前面,而某轮选择中最小值在b后面,当a恰好在开头时,交换过后b就在a前面了,所以选择排序是不稳定的。给个例子([6,5,4,6,2])自己体会。