zoukankan      html  css  js  c++  java
  • 排序算法之冒泡排序

    冒泡排序,每一次从前往后两两比较找出一个最大的(或者最小的)。

     

    普通版

     1 def bubble_sort(alist):
     2     """冒泡排序"""
     3     n = len(alist)
     4     # 这个循环负责控制冒泡排序进行的次数。对于长度为n的序列需要进行n-1次排序,但是range()函数是从0开始产生数字的,故用n-1。
     5     for i in range(n-1):
     6         # 这个循环用于控制每一次具体的冒泡过程,即控制每一次冒泡排序冒泡两两比较的次数。
     7         # 假如有三个数,第一次需要冒泡比较两次;第二次因为最后一个元素已经有序了,所以需要冒泡比较一次。因此这里的j每次都要减去i的值,即不冒“无用之泡泡”
     8         for j in range(n-1-i):
     9             if alist[j] > alist[j + 1]:
    10                 alist[j], alist[j + 1] = alist[j + 1], alist[j]
    11     
    12     return alist

    测试案例:

    1 alist = [5,8,45,1,2,6,4,3]
    2 bubble_sort(alist)
    3 
    4 # 输出
    5 [1, 2, 3, 4, 5, 6, 8, 45]

    优化版:

    假设现在有一个数组[6,1,2,3,4,5],当我们进行完第一次冒泡排序过程后变为[1,2,3,4,5,6],这时候数组已经变成有序的了,程序要是再继续循环岂不是一直在做无用功,那怎么知道数组已经是有序的了呢?

    通过设置标志符来解决。

     1 def bubble_sort(alist):
     2     """冒泡排序"""
     3     n = len(alist)
     4     # 这个循环负责控制冒泡排序进行的次数。对于长度为n的序列需要进行n-1次排序,但是range()函数是从0开始产生数字的,故用n-1。
     5     for i in range(n-1):
     6         # 这个循环用于控制每一次具体的冒泡过程,即控制每一次冒泡排序冒泡两两比较的次数。
     7         # 假如有三个数,第一次需要冒泡比较两次;第二次因为最后一个元素已经有序了,所以需要冒泡比较一次。因此这里的j每次都要减去i的值,即不冒“无用之泡泡”。
     8         count = 0
     9         for j in range(n-1-i):
    10             # 班长从头走到尾
    11             if alist[j] > alist[j + 1]:
    12                 alist[j], alist[j + 1] = alist[j + 1], alist[j]
    13                 count += 1
    14         if count == 0:
    15             return alist
    16                
    17     
    18     return alist
    19     

    时间复杂度:最优为O(n),最坏为O(n2)

    稳定排序

    参考资料:python排序算法之一:冒泡排序(及其优化),https://www.cnblogs.com/SteveWesley/p/10007987.html(里面有个冒牌的排序算法)

  • 相关阅读:
    Object.create() 实现
    Subpub 订阅/发布
    闭包的一种用法
    console 高级用法
    instanceof typeof
    reg 正则
    zepto js 源码 解读
    【Pro ASP.NET MVC 3 Framework】.学习笔记.8.SportsStore:管理
    【Pro ASP.NET MVC 3 Framework】.学习笔记.7.SportsStore:购物车
    【Pro ASP.NET MVC 3 Framework】.学习笔记.6.SportsStore:导航
  • 原文地址:https://www.cnblogs.com/xiaowei2092/p/11763241.html
Copyright © 2011-2022 走看看