选择排序(Selection-sort)是一种简单直观的排序算法。
它的工作原理:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,
然后,再从剩余未排序元素中继续寻找最小(大) 元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。(拿出最大或最小, 然后在剩余中再拿最大或最小)。
def selection_sort(data_list):
length = len(data_list)
for i in range(length-1):
min_index = i # 存储最小值下标,方便后面交换
for j in range(i+1, length):
if data_list[min_index] > data_list[j]:
min_index = j
if min_index != i:
data_list[i], data_list[min_index] = data_list[min_index], data_list[i]
return data_list
unsort = [3, 4, 2, 1, 5, 6, 7, 8]
print(selection_sort(unsort))
性能分析
首先,选择排序的只需要一个变量做为交换,因此空间复杂度是O(1),是一种原地排 序算法。
其次,选择排序在未排序区间选择一个最小值,与前面的元素交换,对于值相同的元素,
因为交换会破坏他们的相对顺序,因此它是一种不稳定的排序算法。
比如对于 4,1,4,2,5,这样的序列, 第一次选择后是这样的:1,4,4, 2, 5 ,
此时先后的顺序未变,第二次选择后是这样的:1,2,4,4,5 ,需要拿第一个 4 与 2 交换,
因此两个 4 的相对顺序已经变化,因此选择排序是一种不稳定的排序算法。
选择排序无论数据初始是何种状态,均需要在未排序元素中选择最小或最大元素与未排序序列中的首尾元素交换,
因此它的最好、最坏、平均时间复杂度均为 O(n^2)