排序算法之冒泡排序

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

 

普通版

 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(里面有个冒牌的排序算法)

posted @ 2019-10-30 10:15  一名石匠  阅读(263)  评论(0编辑  收藏  举报