冒泡排序:用Python實現從小到大排序

你有沒有想過,水中的氣泡是怎麼上升的?它們會從水底慢慢往上冒,較大的氣泡會更快到達水面。冒泡排序的名字就來源於這個現象——它會讓數組中較大的元素“冒泡”到數組的末尾。

簡單來說,冒泡排序(Bubble Sort)是一種基礎的排序算法。它的核心思想是:重複地走訪要排序的數組,一次比較兩個相鄰的元素,如果它們的順序錯誤就交換位置,直到整個數組有序。

冒泡排序的工作步驟

  1. 比較相鄰元素:從數組第一個元素開始,依次比較相鄰的兩個元素(比如第1個和第2個,第2個和第3個,…)。
  2. 交換元素:如果前一個元素比後一個大,就交換它們的位置。
  3. 重複操作:重複上述步驟,直到所有元素都“冒泡”到正確的位置。每完成一輪,數組末尾的一個最大元素就會被排好序。
  4. 優化提前終止:如果某一輪中沒有發生任何交換,說明數組已經有序,無需繼續排序。

用Python實現冒泡排序

下面通過一個具體例子理解排序過程,並寫出Python代碼。假設我們要排序數組:[64, 34, 25, 12, 22, 11, 90]

步驟分解(手動模擬):

  • 第1輪:比較相鄰元素,最大的數(90)會“冒泡”到末尾,數組變爲:[34, 25, 12, 22, 11, 64, 90]
  • 第2輪:比較前6個元素,第二大的數(64)會“冒泡”到倒數第二位,數組變爲:[25, 12, 22, 11, 34, 64, 90]
  • 第3輪:繼續比較,直到所有元素有序。

Python代碼實現:

def bubble_sort(arr):
    n = len(arr)
    # 外層循環控制排序輪數(最多n-1輪)
    for i in range(n - 1):
        swapped = False  # 標記本輪是否發生交換
        # 內層循環比較相鄰元素,每輪減少一次比較(末尾已排序)
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                # 交換相鄰元素(Python語法簡化交換)
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True
        # 如果本輪無交換,說明數組已有序,提前終止
        if not swapped:
            break
        print(f"第{i+1}輪結束:{arr}")
    return arr

# 測試
test_arr = [64, 34, 25, 12, 22, 11, 90]
print("原始數組:", test_arr)
sorted_arr = bubble_sort(test_arr)
print("最終排序:", sorted_arr)

代碼解釋:

  1. 外層循環for i in range(n - 1)
    控制排序輪數,最多需要n-1輪(n爲數組長度),因爲每輪會確定一個最大元素的位置。

  2. 內層循環for j in range(0, n - i - 1)
    比較相鄰元素,每輪內層循環的次數比上一輪少1次(因爲末尾i個元素已排好序)。

  3. 交換邏輯arr[j], arr[j + 1] = arr[j + 1], arr[j]
    用Python的元組賦值語法,簡潔交換相鄰元素的值。

  4. 優化標誌swapped
    如果某輪無交換,說明數組已有序,直接終止循環,避免無效比較。

運行結果(含中間過程):

原始數組: [64, 34, 25, 12, 22, 11, 90]
第1輪結束:[34, 25, 12, 22, 11, 64, 90]
第2輪結束:[25, 12, 22, 11, 34, 64, 90]
第3輪結束:[12, 22, 11, 25, 34, 64, 90]
第4輪結束:[12, 11, 22, 25, 34, 64, 90]
第5輪結束:[11, 12, 22, 25, 34, 64, 90]
最終排序: [11, 12, 22, 25, 34, 64, 90]

冒泡排序的特點

  • 時間複雜度:最壞情況(完全逆序)爲O(n²),最好情況(已排序)爲O(n)(優化後)。
  • 空間複雜度:O(1)(僅需臨時變量,無額外空間)。
  • 穩定性:穩定排序(相等元素相對位置不變)。

總結

冒泡排序是最簡單的排序算法之一,核心是“相鄰元素比較與交換”。雖然效率較低(適合小規模數據),但理解其原理對掌握排序思想至關重要。通過Python代碼實現後,你可以輕鬆處理簡單的排序需求,或嘗試優化爲更高效的版本(如歸併排序、快速排序)。

現在,嘗試用其他數組(如[5, 3, 8, 4, 2])測試冒泡排序,看看是否能正確輸出排序結果吧!

小夜