# 原理:每两个相邻的数之间做比较,如果左边大的话,那么两者作交换。因此执行完一轮之后就会把最大的数放到列表的最右边 # 然后按照相同的方式比较剩余元素,最终把所有的元素都按照顺序排好 # 如果把列表竖直方向立起来,那么排序的过程就像冒泡一样,大的往上,小的往下 import random def bubble_sort(arr): for i in range(len(arr)-1): # 这里为什么减去1,因为n个元素,只需执行n-1轮,n-1个元素排好了,那么最后一个也就确定了 for j in range(len(arr)-1-i): # 外层循环每执行一轮,排好一个,那么就只需要排剩下的元素就行了 if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] arr = list(range(20)) random.shuffle(arr) print(arr) # [1, 18, 0, 15, 12, 16, 5, 7, 10, 11, 8, 13, 2, 17, 14, 3, 6, 4, 9, 19] bubble_sort(arr) print(arr) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
关于冒泡排序,还有个可以优化的地方,那就是不一定非要跑完len(arr)-1轮,有可能在没有跑完之前就已经排好了
import random def bubble_sort(arr): for i in range(len(arr)-1): # 可以让flag=True flag = True # 只要没有排好,就必定会执行flag=False for j in range(len(arr)-1-i): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] flag = False # 结束函数,可以看看跑了多少轮 if flag: return i arr = list(range(20)) random.shuffle(arr) print(arr) # [0, 9, 13, 2, 6, 4, 1, 12, 15, 18, 8, 7, 10, 5, 3, 17, 14, 11, 16, 19] print(bubble_sort(arr)) # 11 print(arr) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] # 可以看到,只跑了11趟就结束了 # 如果跑满len(arr)-1趟的话,那么arr正好是逆序的