Ruby 的表達能力極強,快速排序可壓縮為單行程式碼。本文展示這個經典的函數式實作,解析其運作原理,並對比傳統寫法。
def quick_sort(a)
(x = a.pop) ? quick_sort(a.select { |i| i <= x }) + [x] + quick_sort(a.select { |i| i > x }) : []
end
array = [72, 6, 57, 88, 60, 42, 83, 73, 42, 48, 85]
p quick_sort(array)
# => [6, 42, 42, 48, 57, 60, 72, 73, 83, 85, 88]
def quick_sort(a)
# 1. a.pop 移除並回傳最後一個元素作為基準值 x
# 2. 若 x 存在 (陣列非空),執行遞歸;否則回傳空陣列 [] (基準情況)
(x = a.pop) ? # 基準值選取與空陣列檢查
quick_sort(a.select { |i| i <= x }) + # 遞歸排序 <= x 的子陣列
[x] + # 基準值本身
quick_sort(a.select { |i| i > x }) # 遞歸排序 > x 的子陣列
: [] # 空陣列回傳 []
end
a.pop 修改原陣列、select 過濾、三元運算子 ? :、陣列連接 +。
def quick_sort_rand(a)
return a if a.size < 2
x = a.delete_at(rand(a.size)) # 隨機選取並移除基準值
quick_sort_rand(a.select { |i| i <= x }) + [x] + quick_sort_rand(a.select { |i| i > x })
end
| 版本 | 平均時間 | 最壞情況 | 空間 | 穩定性 |
|---|---|---|---|---|
| 單行版 (固定基準) | O(n log n) | O(n²) | O(n log n) | 不穩定 |
| 隨機基準版 | O(n log n) | O(n²) 極低機率 | O(n log n) | 不穩定 |
Ruby 內建 sort | O(n log n) | O(n log n) | O(n) | 穩定 |