首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Ruby 一行程式碼實現快速排序:函數式寫法極致精簡

     編輯:更多程式設計知識

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

特點分析

  • 非原地排序:每次遞歸建立新陣列,空間複雜度 O(n log n) 平均、O(n²) 最壞。
  • 基準值固定選最後一個:已排序陣列會退化為 O(n²),實務建議隨機選取基準值。
  • 函數式風格:無副作用、不可變資料、表達式導向,程式碼極度精簡。
  • Ruby 特有語法: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

效能對比

實務建議:生產環境直接使用 array.sort 或 array.sort_by,底層採用 Timsort(混合歸併+插入),保證 O(n log n) 最壞情況且穩定。單行版適合程式碼高爾夫、教學展示、原型驗證。

總結

Ruby 一行快速排序展現了函數式程式設計在動態語言中的極致表達力。理解其基準值選取、分區、遞歸合併流程,有助於掌握分治法核心思想。但記住:內建 sort 才是生產環境的正解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
版本平均時間最壞情況空間穩定性
單行版 (固定基準)O(n log n)O(n²)O(n log n)不穩定
隨機基準版O(n log n)O(n²) 極低機率O(n log n)不穩定
Ruby 內建 sortO(n log n)O(n log n)O(n)穩定