选择排序算是很简单一种排序算法了,因为算法思想简单所以排序也不稳定。这里介绍排序算法思想,Python代码段和算法时间复杂度。
选择排序算法思想
对于一个无序的序列我们可以通过n-1趟排序得到排序结果。
我们定义一个无序序列list[R0…….RN]
1.初始状态:无序区为list
2.第一趟排序
在无序区间内选择一个关键字作为暂时的最小值min,然后将min与无序区间内的数挨个作比较,遇到比min的值小的做交换然后继续比较,直到比较完全部的无序区间。将min与无序数列的第一个数交换(R0)。此时将无序区间缩小成list[R1….RN].
3.第i趟比较
在i之前的数已经比较完可以看做是有序序列区间,在i之后的数仍为无序区间待比较。此时重复2的步骤在list[Ri….Rn]中选取一个关键字作为暂时最小值然后进行比较。
通俗点说可以说成,在未排序序列中找到最小元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,知道所有元素均排序完成。
代码片
import random
def selection_sort(list):
for i in range(0,len(list)):#第一趟循环排出有序数列
min = i #设定暂时最小值为无序区间第一个元素
for j in range(i+1,len(list)):#第二趟排序让min去和无序数列的数作比较找出真正最小值
if list[min] > list[j]:
min = j
list[min],list[i] = list[i],list[min]
return list
if __name__ == '__main__':
list = [45,32,67,8,2,43]
print selection_sort(list)
b = [random.randint(1,1000) for i in range(100)]
print selection_sort(b)
时间复杂度
选择排序的时间复杂度依旧由三个部分组成,一部分是交换操作所占用时间,一部分是比较数操作占用时间,另一部分是赋值操作占用的时间。
交换操作介于0到(n-1)之间。分为最好和最坏情况。
比较操作平均时间n*(n-1)/2 (1+2+3+4+..+n)
赋值操作时间介于0到3*(n-1)之间
为什么说选择排序是不稳定的呢,因为选择排序实际上是在无序序列中选出最小的一个数放入有序序列,那么当无序序列中有两个数是一样的时候实际上这两个数位置是有区别的,但是很可能经过某次比较之后两个数的位置就和原先位置关系不一样了。