1. 程式人生 > >Python實現氣泡排序

Python實現氣泡排序

最近在學習Python,下面是我的一些筆記

氣泡排序

實現思路 : 使用雙重for迴圈,內層變數為i, 外層為j,在內層迴圈中不斷的比較相鄰的兩個值(i, i+1)的大小,如果i+1的值大於i的值,交換兩者位置,每迴圈一次,外層的j增加1,等到j等於n-1的時候,結束迴圈
第一次看不懂很正常,不要灰心,下面是使用程式碼的實現

arr = [7, 4, 3, 67, 34, 1, 8]

def bubble_sort(arr):
    n = len(arr)
    for j in range(0, n - 1):
        for i in range(0, n - 1
- j): if arr[i] > arr[i + 1]: arr[i], arr[i + 1] = arr[i + 1], arr[i] bubble_sort(arr) print(arr) # [1, 3, 4, 7, 8, 34, 67]

關鍵點其實在雙重for迴圈變數的配置,我們來分析一下
第一次迴圈: j = 0, i~n-2 range(0, n-1)
第二次迴圈: j = 1, i~n-3 range(0, n-1-1)
第三次迴圈: j = 2, i~n-4 range(0, n-1-1-1)
—> range(0, n-1-j)

理解這一點後,我們就可以換一種寫法來實現了

def bubble_sort2(arr):
    for j in range(len(arr) - 1, 0, -1):  # [n-1, n-2, ....2, 1]
        for i in range(0, j):
            if arr[i] > arr[i + 1]:
                arr[i], arr[i + 1] = arr[i + 1], arr[i]


bubble_sort2(arr)
print(arr)  # [1, 3, 4, 7, 8, 34, 67]

優化
寫到這裡我們發現,無論是第一種寫法還是第二種寫法,他的時間複雜度都是O(n ^ 2), 第二種寫法也僅僅停留在優化樣式的層面,並沒有帶來效能的提升,想象一下,如果我們輸入的本來就是一個有序序列,其實只需要一次迴圈就夠了,所以我們需要針對特殊情況進行優化

def bubble_sort3(arr):
    for j in range(len(arr)-1, 0, -1):
        count = 0
        for i in range(0, j):
            if arr[i] > arr[i + 1]:
                arr[i], arr[i + 1] = arr[i + 1], arr[i]
                count += 1
        if count == 0:
            return


bubble_sort3(arr)
print(arr)  # [1, 3, 4, 7, 8, 34, 67]

我們在迴圈中定義了一個變數count,如果第一次迴圈後count沒有變化,就說明輸入的是有序序列,這時我們直接return退出迴圈,這時候的時間複雜度為O(n)

擴充套件知識:氣泡排序還是一種穩定性的演算法,如果序列中出現兩個相同的值的時候,無論選取最大值,還是最小值進行排序,最後兩個相同值的前後位置都是不變的。