python 数据结构与算法 day04 选择排序

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的复杂度;

猜你喜欢

转载自www.cnblogs.com/xuanxuanlove/p/9941398.html