演算法圖鑑
Sorting · 比較表

排序演算法比較

八種排序演算法的時間、空間、穩定性、是否原地,以及最重要的:什麼情況該選哪一個。

演算法時間空間最好最壞穩定原地難度
Bubble Sort氣泡排序O(n²)O(1)O(n)O(n²)入門
Selection Sort選擇排序O(n²)O(1)O(n²)O(n²)入門
Insertion Sort插入排序O(n²)O(1)O(n)O(n²)入門
Merge Sort合併排序O(n log n)O(n)O(n log n)O(n log n)進階
Quick Sort快速排序平均 O(n log n)O(log n)O(n log n)O(n²)進階
Heap Sort堆積排序O(n log n)O(1)O(n log n)O(n log n)進階
Counting Sort計數排序O(n+k)O(n+k)O(n+k)O(n+k)進階
Radix / Bucket Sort基數與桶排序O(d·n)O(n+k)O(d·n)O(d·n)進階

什麼時候選哪一個

選擇指南

  • 不知道選什麼:語言內建的 sort。它通常是 Timsort(Python、Java 物件)或 introsort(C++),已經幫你混合了合併、插入、堆積。
  • 同分要保持原順序:穩定的那幾個——合併、插入、計數、基數。快速與堆積排序不穩定。
  • 鍵是小整數:計數排序或基數排序,這是唯一能打破 n log n 下界的方法,因為它們不靠比較。
  • 幾乎已排序:插入排序 O(n)。氣泡加提前結束也行,但小值在尾端時會退化。
  • 記憶體很緊:堆積排序(O(1) 額外空間、保證 n log n)或快速排序(O(log n) 堆疊)。合併排序要多一份 O(n)。
  • 資料放不進記憶體:合併排序,一次讀一段、排好寫出去、最後多路合併。