排序算法之冒泡排序
冒泡排序,每一次从前往后两两比较找出一个最大的(或者最小的)。
普通版:
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(里面有个冒牌的排序算法)