還記得我第一次聽到「泡泡排序」這四個字時,腦海裡浮現的是肥皂泡泡跟珍珠奶茶的畫面。
結果打開講義一看 — — 什麼珍珠?沒有!也沒有肥皂泡泡!只有一堆數字在那邊跑來跑去,比較、交換、排列,最後由小排到大。
「這…到底跟泡泡有什麼關係?」
直到老師解釋 — — 這就像泡泡會浮到水面上,最大的數字也會一步一步「浮」到列表的最右邊。
原來如此!難怪會不停的交換、交換、交換…
泡泡排序的基本原理:
從數列的第一個元素開始,比較相鄰的兩個元素。
如果左邊的元素比右邊的元素大,則交換它們的位置;反之就不用交換。重複以上步驟。對於數列中的每一對相鄰元素都進行比較和交換,直到數列的末尾。重複以上步驟,直到整個數列都排序完成。
很神奇的是,
對於一組包含N個數字資料的數列,會是進行N-1次的比對,比如[1, 3, 4, 2],是一組4個數字的數列,所以會比對(4–1)次,也就是3次:

我想說還是要盡量畫得可愛一點!
這題會需要用到雙層for迴圈,容易踩初學者的第一個坑 — 忘了內層迴圈的範圍是要減去外層迴圈的次數。
(因為每跑一輪,就會有一個最大值固定在右邊,不用再比。)
Python程式碼如下:

上述程式碼會印出:
第 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必練的九九乘法表 — — 幫我們打下對理解雙層迴圈、條件判斷的基礎。