快速排序由 C.A.R. Hoare 於 1962 年提出,採用分治法策略,平均時間複雜度 O(n log n),是實務中最常用的高效排序演算法之一。本文詳解其核心邏輯、分區策略與 C# 實作細節。
本範例採用雙指針向中間掃描:
i 從左向右找第一個 ≥ 基準值的元素。j 從右向左找第一個 ≤ 基準值的元素。i < j 交換兩元素,繼續掃描;否則分區完成,返回 j 作為分界點。public static class QuickSort
{
public static void Sort(int[] arr) => Sort(arr, 0, arr.Length - 1);
private static void Sort(int[] arr, int left, int right)
{
if (left < right)
{
int pivot = arr[(left + right) / 2]; // 取中間元素為基準
int i = left - 1, j = right + 1;
while (true)
{
while (arr[++i] < pivot) ;
while (arr[--j] > pivot) ;
if (i >= j) break;
Swap(arr, i, j);
}
Sort(arr, left, i - 1);
Sort(arr, j + 1, right);
}
}
private static void Swap(int[] arr, int i, int j)
{
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
}
// 測試
static void Main()
{
int[] data = { 20, 41, 27, 14, 16, 1, 8, 55, 9, 35, 22, 14 };
QuickSort.Sort(data);
Console.WriteLine("快速排序結果:" + string.Join(", ", data));
}
| 指標 | 複雜度 | 備註 |
|---|---|---|
| 時間 (平均) | O(n log n) | 分區相對平衡 |
| 時間 (最差) | O(n²) | 已有序/逆序且基準選取不當 |
| 空間 | O(log n) | 遞迴呼叫堆疊深度 (平均) |
| 穩定性 | 不穩定 | 交換可能改變相等元素順序 |
Array.Sort / List<T>.Sort 採用 Introspective Sort (Introsort):快速排序 + 堆積排序 (深度過深時切換) + 插入排序 (小區間),兼具平均效能與最差情況保證。實務開發請直接使用內建方法。