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

    talk is cheap,show me the code
  • 相关阅读:
    IOS中彻底删除mysql方法
    (iOS)Storyboard/xib小技巧
    (iOS)关于GCD死锁的问题
    android-通知Notification
    android-多线程
    android-服务Service
    android-OptionMenu
    android-SQLite 和 Content
    android-数据持久化
    Russia
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9941398.html
Copyright © 2020-2023  润新知