部分转自 https://blog.youkuaiyun.com/Dby_freedom/article/details/82154869
介绍 :
选择排序是一个很容易理解和实现的简单排序算法. 学习它之前首先要知道它有两个很鲜明的特点
1. 运行时间和输入无关
选择排序,是通过每次选择最小的数或者最大的数,然后将它放在它应该出现的位置上。
所以,选择排序的时间复杂度是O(N*N),不管是最好情况还是最坏情况,找最小数的过程都需要遍历一遍,所以,选择排序最好情况也是O(N*N)。
因此,使用这种算法的我们会惊讶的发现,一个已经有序的数组或者数组内元素全部相等和一个打乱的序列所用的时间是一样长的
2. 数据移动是最少的
选择排序的交换次数和数组大小关系是线性的,选择无疑是最简单直观的排序.看下面的原理时可以很容易明白这一点
步骤:
- 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
- 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
- 以此类推,直到所有元素均排序完毕。
代码
def select_sort(lst):
n = len(lst)
for i in range(n):
min = i
for j in range(i+1,n):
if lst[j] < lst[min]:
min = j
lst[min],lst[i] = lst[i],lst[min] #将最小的放到本轮的最前面
优化:
笔者在网上找了找,发现排序算法的优化比较少, 一种思路是,从每次找出一个,优化为每次找出2个,代码如下
def select_sort_1(lst):
n = len(lst)
for i in range(n):
min = i
max = n-1
n = n - 1
for j in range(i+1,n+1):
if lst[j] < lst[min]:
min = j
if lst[j] > lst[max]:
max = j
lst[min],lst[i] = lst[i],lst[min] #将最小的放到本轮的最前面
lst[max],lst[n] = lst[n],lst[max] #将最大的放到本轮的最前面
也可以一次找出多个进行,排序,但是感觉优化不大
运行
结果 :
结论 :
选择排序相比冒泡排序还是很有优势的, 同样的10000个数字,冒泡为 11秒多(见上篇博客)
然后就是优化了: 明显看出,优化不大,可能这就是网上对选择排序的优化比较少的缘故了吧