zoukankan      html  css  js  c++  java
  • python 数据结构与算法 day04 冒泡排序

    1. 冒泡排序

    思路:

    可以看做按对高低不一的一组学生按照大小个排队,校长从每次从头开始走,观察当前站的位置与后一个位置元素大小进行比较,如果比当前元素大,就交换两者的位置,然后往后走一步,接着比较当前元素与后一个位置元素大小,重复刚才的过程,,,校长一次从头走到尾的遍历过程最大位置的元素跟着走到了最后,第二次遍历,队列中第二大的元素走到了倒数第二个位置,,,以此类推;

    2. 代码实现(python)

    def bubble_sort(L):
        """冒泡排序"""
        n=len(L)
        for i in range(n-1):  # 校长从头走到尾的过程持续进行了n-1次
            for j in range(n-1-i):  # 校长在一次遍历中需要从头走到尾,比较当前位置元素与下一个元素的大小,最终把最大的元素安排到最后一个位置
                if L[j]>L[j+1]:
                    L[j],L[j+1]=L[j+1],L[j]
        return L
    print(bubble_sort([2,6,1,3,8,4,7,0,9]))

    运行结果:

     3. 时间复杂度

    冒泡排序的时间复杂度是O(n^2)----因为包含两个for 循环;

    4. 稳定性

    稳定性: 冒泡排序是稳定的,被排序的数组中出现两个相同的元素时,冒泡排序会维持两者原来的相对顺序,所以是稳定的

     5. 优化

    我们发现当数组原本就是有序序列,使用刚才的实现复杂度仍然是O(n^2) ,其实我们可以对它进行改进,就是当校长从头走到尾,发现并没有发生元素的交换过程,就代表序列已经是有序的,就不需要再重复进行从头走到尾的遍历工作了;

    def bubble_sort(L):
        """冒泡排序"""
        n=len(L)
        for i in range(n-1):  # 校长从头走到尾的过程持续进行了n-1次
            count=0
            for j in range(n-1-i):  # 校长在一次遍历中需要从头走到尾,比较当前位置元素与下一个元素的大小,最终把最大的元素安排到最后一个位置
                if L[j]>L[j+1]:
                    L[j],L[j+1]=L[j+1],L[j]
                    count+=1
            if count==0:  # 如果从头走到尾的某次过程未发生元素的交换,那么被排序的序列已经是有序的~ 直接跳出循环即可
                break
        return L
    print(bubble_sort([2,6,1,3,8,4,7,0,9]))

     这样对有序序列的时间复杂度就变为O(n);

    talk is cheap,show me the code
  • 相关阅读:
    ES6的reduce( )方法 可以数组求和、数组去重、二维数组转一维数组、计算数组中每个元素出现的次数
    防止/禁止页面后退
    CSS预处理器SASS将迁移到Dart Sass
    FormData 对象的使用
    javascript中编码与解码的decodeURI()、decodeURIComponent()区别
    Chrome谷歌浏览器调试技巧小结
    javaweb:tomcat&servlet
    java:Druil连接池
    java:c3p0连接池的使用
    java:JDBC的使用方式
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9941346.html
Copyright © 2011-2022 走看看