1. 选择排序
原理:从后面无序序列中选出最小的元素放在有序序列的后面,第一次先把第一个位置元素作为比较的对象,从后面n-1个元素中选出最小的那个元素 跟第一个位置元素进行交换,然后令第二个位置作为比较的对象,从后面n-2个元素中选最小的元素,跟第二个位置元素进行交换,,,以此类推;
下面的这个过程 是首先从前面系列中选出一个最大的元素,跟最后一个位置元素进行比较,如果前面序列中最大的元素比最后一个位置元素大 就交换,这样序列中最后一个位置元素就是当前序列最大的元素;
然后从前面n-2个元素中再选一个最大的 跟序列中倒数第二个位置元素比较,如果比倒数第二个位置元素大,就交换,以此类推,逐渐把序列中大的元素放到队尾;
2.代码实现
基于选择后面序列中最小的元素,跟前面位置元素进行比较,把小的元素放在序列前面,依次找到序列中小的元素放在序列前面:
def select_sort(L): """选择排序""" n=len(L) for i in range(n-1): # 对应n-1个过程,每一次都会选出无序序列中的最小的元素放在前面有序序列中,这个过程持续n-1次 对应分别选出了n-1个最小 min=i # 对每一次查找最小元素的过程,首先令有序序列中最后一个元素为该次过程需要比较的元素,拿后面位置的元素跟i位置的元素比较 for j in range(i+1,n): # 选出后面无序序列中的最小值 if L[j]<L[min]: min=j # 每一次找到一个比有序序列中最后一个位置元素小的 不急着交换,先记下来,因为目的是找到无序序列中最小的元素,而不是仅仅比i位置元素小就够了 L[i],L[min]=L[min],L[i] return L print(select_sort([2,6,1,3,8,4,9,5,0]))
运行结果:
3. 时间复杂度
选择排序的时间复杂度是O(n^2)
因为选择排序整体过程是逐步选出n-1个小元素放在前面n-1个位置,这就需要n的复杂度,然后内部对于每一次选出一个小元素 有需要比较无序序列中的所有元素,这个过程也需要n的复杂度;
4. 稳定性
选择排序是不稳定的;
可以看上面那张图,就是从前面无序序列中选大元素放在最后的排序过程,可以发现在从前往后找大元素的过程中,如果有两个93 就会把前面一个93放在最后,这样就打乱了相同元素原有的相对顺序(因为首先从头往后找最大元素,知道发现第一个最大也就是前面的93 然后接着往后比较,等到比对到第二个93时 第二个93并不比当前最大元素--第一个93大 所以不交换,所以仍然是第一个93作为最大元素往后走的~这就打乱了原有的顺序,所以是不稳定的)
5. 优化
选择排序对于有序序列仍然是O(n^2)的复杂度,并且无法进行优化,因为从头到尾进行选小元素放在前面的过程有n次,每一次选小元素都需要比较所有元素 也需要n的复杂度;