1. 程式人生 > 實用技巧 >Python中的排序---冒泡法

Python中的排序---冒泡法

氣泡排序(英語: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