1 ''' 2 冒泡排序算法及其優化 3 冒泡排序的基本特征是只能交換相鄰的元素。 4 從下邊界開始,一趟掃描下來,可以把當前最大值頂到上邊界; 5 如果沒有發生交換操作,則表示數組是有序的。 6 ''' 7 8 9 # 算法一:基本冒泡排序 10 def BubbleSort_1(arr): 11 # 外層循環累計排序輪數,同時控制待排序數組的上邊界,即A[0..i]為待排序部分 12 # 內層循環掃描A[0..i-1],比較相鄰元素,並通過交換元素值的方式將最大值頂到最上方 13 for i in range(len(arr) - 1, 0, -1): 14 for j in range(i): 15 if arr[j] > arr[j + 1]: 16 arr[j], arr[j + 1] = arr[j + 1], arr[j] 17 print('第%d次排序結果:'%(8-i),end='') 18 for j in range(len(arr)): 19 print('%3d'%arr[j]) 20 21 22 # 算法二:冒泡排序改進,設置交換操作標志 23 def BubbleSort_2(arr): 24 for i in range(len(arr) - 1, 0, -1): 25 Flag = False # 先假設未做交換操作 26 for j in range(0, i): 27 if arr[j] > arr[j + 1]: 28 arr[j], arr[j + 1] = arr[j + 1], arr[j] 29 Flag = True # 設置交互操作標志 30 if not Flag: 31 break # 無交換操作,表示已完成排序,退出循環 32 33 34 # 算法二:雙向冒泡(雞尾酒排序),因為未發生交換操作的區域是有序的,故每輪掃描下來可以更新上下邊界,減少掃描范圍 35 def BubbleSort_3(arr): 36 low, high = 0, len(arr) - 1 37 while low < high: 38 swapPos = low # 先假設最后一次發生交換操作的位置為low 39 for j in range(low, high): # 順序掃描A[low..high-1] 40 if arr[j] > arr[j + 1]: 41 arr[j], arr[j + 1] = arr[j + 1], arr[j] 42 swapPos = j 43 high = swapPos # 修改待排序數組的上界為最后一次發生交換操作的位置 44 for j in range(high, low, -1): # 逆序掃描A[low+1..high] 45 if arr[j] < arr[j - 1]: 46 arr[j], arr[j - 1] = arr[j - 1], arr[j] 47 swapPos = j 48 low = swapPos # 修改待排序數組的下界為最后一次發生交換操作的位置