(Day 12) 氣泡排序 (Bubble Sort)
終於進入演算法的部分,預計會介紹 3~4 個很常見的排序演算法,所以光排序這個主題就會用掉 3~4 天的篇幅,今天除了介紹 Bubble Sort 外,會先簡單介紹一下排序,讓各位讀者更好地認識排序演算法。
選擇排序 (Selection Sort) 是一種簡單直觀的排序演算法。核心概念: 每一輪從尚未排序的元素中挑出最小 (或最大) 者,放到目前應在的位置,一直重複直到完成。可以把它想成「選拔賽」: 第一輪選出最優放第一名,第二輪從剩下的人選次優放第二名,依此類推。
由於每一輪至少能確定一個元素的最終位置,總共需要執行 n-1 輪。
以序列 [29, 10, 14, 37, 13] 為例:
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
arr = [29, 10, 14, 37, 13]
print(selection_sort(arr)) # 輸出: [10, 13, 14, 29, 37]
說明:即使資料本來已排序,外圈第 i 輪仍需在 [i..n-1] 全掃描以確認最小值,無法提前終止。
面向 | 說明 |
---|---|
優點 | 實作容易、流程清楚;原地排序 O(1);每輪最多一次交換,交換成本低 |
缺點 | 無論資料狀態如何,掃描成本固定 → O(n^2);不穩定 |
選擇排序的價值在於思路清晰與交換成本低,雖然整體效率不佳 $O(n^2)$,但非常適合用來與其他基礎排序做對照: