還記得我第一次聽到「泡泡排序」這四個字時,腦海裡浮現的是肥皂泡泡跟珍珠奶茶的畫面。
結果打開講義一看——什麼珍珠?沒有!也沒有肥皂泡泡!
只有一堆數字在那邊跑來跑去,比較、交換、排列,最後由小排到大
「這...到底跟泡泡有什麼關係?」
直到老師解釋——這就像泡泡會浮到水面上,最大的數字也會一步一步「浮」到列表的最右邊。
原來如此!難怪會不停的交換、交換、交換...
從數列的第一個元素開始,比較相鄰的兩個元素。
如果左邊的元素比右邊的元素大,則交換它們的位置;反之就不用交換。
對於數列中的每一對相鄰元素都進行比較和交換,直到數列的末尾。
重複以上步驟,直到整個數列都排序完成。
很神奇的是,
對於一組包含N個數字資料的數列,會是進行N-1次的比對,
比如[1, 3, 4, 2],是一組4個數字的數列,所以會比對(4-1)次,也就是3次:
這題會需要用到雙層for迴圈,容易踩初學者的第一個坑--忘了內層迴圈的範圍是要減去外層迴圈的次數。
(因為每跑一輪,就會有一個最大值固定在右邊,不用再比。)
Python程式碼如下:
arr = [1, 3, 4, 2] # 建立一個數列
n = len(arr) # 計算數列長度 (4)
for i in range(n): # 外層迴圈:總共要跑 n 輪
print(f"第 {i+1} 輪開始:{arr}") # 觀察是第幾輪印出的結果
for j in range(0, n - i - 1): # 內層迴圈:每次少比較1個已排好的元素
print(f" 比較 {arr[j]} 和 {arr[j+1]}")
if arr[j] > arr[j + 1]: # 如果左邊比較大,就交換
arr[j], arr[j + 1] = arr[j + 1], arr[j] # Python的交換語法
print(f" 交換 → {arr}")
else:
print(" 不交換")
print(f"排序完成:{arr}")
上述程式碼會印出:
第 1 輪開始:[1, 3, 4, 2]
比較 1 和 3
不交換
比較 3 和 4
不交換
比較 4 和 2
交換 → [1, 3, 2, 4]
第 2 輪開始:[1, 3, 2, 4]
比較 1 和 3
不交換
比較 3 和 2
交換 → [1, 2, 3, 4]
第 3 輪開始:[1, 2, 3, 4]
比較 1 和 2
不交換
第 4 輪開始:[1, 2, 3, 4]
排序完成:[1, 2, 3, 4]
(其實到了第4輪就已經是排好的了,但程式還是會跑這一輪。)
另外很特別的是,很多程式語言在交換兩個變數時,需要使用一個臨時變數,
例如,a=5、b=3,想要做到a跟b交換,就要先創一個c,然後先讓c=a,a再=b,最後b=c;
但在Python是允許你在同一行就同時交換兩個變數的值:a,b = b, a
燈愣!這樣一行就交換完了!
所以倒數第六行程式碼才會這樣寫 arr[j], arr[j + 1] = arr[j + 1], arr[j]
我覺得這個真的是方便又好記!
實務上幾乎沒人用泡泡排序來處理大量資料,因為很耗時。
不過,泡泡排序像是「演算法的幼稚園老師」——雖然它很慢,但它用簡單的動作教我們排序的核心思想。
就像學Python必練的九九乘法表——幫我們打下對理解雙層迴圈、條件判斷的基礎。