Python中的排序---冒泡法
阿新 • • 發佈:2020-07-29
氣泡排序(英語:Bubble Sort)是一種簡單的排序演算法。此演算法依次比較序列的兩個元素的大小,如果元素的順序錯誤,就交換其位置,直到序列的元素變得有序才停止遍歷。
時間複雜度O(n²)
交換過程如下圖:
圖片來源:https://blog.csdn.net/u014745194
程式碼1
升序
lst=[ [1,9,8,5,6,7,4,3,2], [1,2,3,4,5,6,7,8,9] ] lst1=lst[0] print(lst1) length=len(lst1) for i in range(length): ## 控制迴圈的次數,因為每一個數都需要做一次迴圈比較for j in range(length-i-1): ## 因為是兩兩比較,所以要少一次遍歷 if lst1[j] > lst1[j+1]: ## 以下程式碼邏輯,當索引j對應的值比j+1對應的值大時,將較大值j賦值給臨時變數tmp,由於索引j+1的值小,所以向前移動,將其值賦值給索引j,臨時變數(索引j)的值需要依次向後比較 tmp=lst1[j] lst1[j]=lst1[j+1] lst1[j+1]=tmp print(lst1)
統計交換次數和迴圈次數
lst = [[1, 9, 8, 5, 6, 7, 4, 3, 2], [1, 2, 3, 4, 5, 6, 7, 8, 9]] lst1 = lst[0] print(lst1) count = 0 count_swap = 0 length = len(lst1) for i in range(length): for j in range(length - i - 1): count += 1 ## 統計迴圈次數 if lst1[j] > lst1[j + 1]: tmp = lst1[j] lst1[j]= lst1[j + 1] lst1[j + 1] = tmp count_swap += 1 ## 統計交換次數 print(lst1, count, count_swap)
執行結果
[1, 9, 8, 5, 6, 7, 4, 3, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] 36 25
上面例子中特殊的情況(預設已經排序好)
方法1(每一次都比較)
lst=[ [1,9,8,5,6,7,4,3,2], [1,2,3,4,5,6,7,8,9] ] lst1=lst[1] print(lst1) count=0 count_swap=0 length=len(lst1) for i in range(length): for j in range(length-i-1): count+=1 if lst1[j] > lst1[j+1]: tmp=lst1[j] lst1[j]=lst1[j+1] lst1[j+1]=tmp count_swap+=1 print(lst1,count,count_swap)
執行結果:迴圈了36次
[1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] 36 0
程式碼優化
定義一個開關變數,當本次迴圈進來,發現根本不需要交換的時候,改變開關變數的值,直接進入下一次迴圈
lst = [[1, 9, 8, 5, 6, 7, 4, 3, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1]] lst1 = lst[1] print(lst1) count = 0 count_swap = 0 length = len(lst1) for i in range(length): flag = False for j in range(length - i - 1): count += 1 if lst1[j] > lst1[j + 1]: tmp = lst1[j] lst1[j] = lst1[j + 1] lst1[j + 1] = tmp count_swap += 1 flag = True if not flag: break print(lst1, count, count_swap)
執行結果
[1, 1, 1, 1, 1, 1, 1, 1, 1] [1, 1, 1, 1, 1, 1, 1, 1, 1] 8 0