来自b站视频
算法的稳定性
a=b,排序前a在b前面,排序后a还在b前面,称该算法稳定。
原理
它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复至排序完成。
需要两层循环
第一层外层循环j,重复走访多少次range(n-1)
第二层内层循环i,每一次从头走到尾需要比较多少次元素
range(n-1-j)
如图
动图演示
动图来自https://www.cnblogs.com/onepixel/articles/7674659.html
具体实现
def bubblesort(alist):
'''冒泡排序'''
n = len(alist)
for j in range(n-1): # 一共需要走n-1次,range(0,n-1),从0到n-2
for i in range(n-1-j): #一共需要走n-1-j次,range(0, n-1-j),从0到n-2-j
if alist[i] > alist[i+1]:
alist[i+1], alist[i] = alist[i], alist[i+1]
测试
if __name__ == '__main__':
li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(li)
bubblesort(li)
print(li)
优化
若某一次从头走到尾没有进行交换,即表示已全部排序完毕,就退出循环
def bubblesort(alist):
'''冒泡排序'''
n = len(alist)
for j in range(n-1): # 一共需要走n-1次,range(0,n-1),从0到n-2
count = 0
for i in range(n-1-j): #一共需要走n-1-j次,range(0, n-1-j),从0到n-2-j
if alist[i] > alist[i+1]:
alist[i+1], alist[i] = alist[i], alist[i+1]
count += 1
if count == 0: # count为0表示这一次没有进行交换,即已经排序完毕
break # 退出循环
时间复杂度
最优时间复杂度:O(1) 表示遍历一次后未发现有任何可以交换的元素,排序结束
最坏时间复杂度:O(n^2) 表示两次for循环全部执行
稳定:稳定