选择排序法
选择排序法(Selection Sort)可以使用两种方式排序,即在所有的数据中,当大到小排序时,将最大值放大第一个位置,当从小到大排序时,将最大值放入到最后一个位置,就这样的方式循环遍历,循环交换,以此重复,直到排序完成为止
原始数据 | ||||
---|---|---|---|---|
55 | 23 | 87 | 62 | 16 |
第一次排序:找到最小值与第一个交换
第一次 | ||||
---|---|---|---|---|
16 | 23 | 87 | 62 | 55 |
第二次排序:找到最小值与第二个交换
第二次 | ||||
---|---|---|---|---|
16 | 23 | 87 | 62 | 55 |
第三次排序:找到最小值与第三个交换
第三次 | ||||
---|---|---|---|---|
16 | 23 | 55 | 62 | 87 |
按照这种方式依次重复
选择排序法的分析
- 无论最坏情况,最佳情况还是平均情况都需要找到最大值(或者最小值),因此其比较次数为(n-1)+(n-2)+(n-3)+…+3+2+1=n(n-1)/2次,时间复杂度为O(n^2)
- 由于选择排序是以最大或者最小值直接与最前方未排序的键值交换,数据排列顺序很有可能被改变,故不是稳定排序法
- 只需要一个额外空间,所以空间复杂度为最佳
- 此排序法适用于数量小或者有部分数据已经排序过的情况
例子:设计程序实现选择排序法
data = [2,3,1,8,5,6]
def showData(data):
for i in range(len(data)):
print('%3d'%data[i],end='')
print()
def select(data):
for i in range(5):
for j in range(i+1,6):
if data[i] > data[j]:
data[i],data[j] = data[j],data[i]
print()
print('原始数据:')
showData(data)
print('\n--------------------------------------')
select(data)
print('排序后的数据')
showData(data)