快速排序採用分治法,平均時間複雜度 O(n log n),空間複雜度 O(log n)(遞迴堆疊)。
public class QuickSort
{
public void Sort(int[] list, int low, int high)
{
if (high <= low) return; // 0 或 1 元素
if (high == low + 1) // 2 元素直接比較
{
if (list[low] > list[high])
Swap(ref list[low], ref list[high]);
return;
}
QuickSortRecursive(list, low, high);
}
private void QuickSortRecursive(int[] list, int low, int high)
{
if (low < high)
{
int pivot = Partition(list, low, high);
QuickSortRecursive(list, low, pivot - 1);
QuickSortRecursive(list, pivot + 1, high);
}
}
private int Partition(int[] list, int low, int high)
{
int pivot = list[low]; // 選首元素為基準
while (low < high)
{
// 從右向左找第一個 < pivot
while (low < high && list[high] >= pivot) high--;
if (low != high) Swap(ref list[low++], ref list[high]);
// 從左向右找第一個 > pivot
while (low < high && list[low] <= pivot) low++;
if (low != high) Swap(ref list[low], ref list[high--]);
}
return low; // 基準最終位置
}
private void Swap(ref int a, ref int b)
{
int t = a; a = b; b = t;
}
}
| 策略 | 優點 | 缺點 |
|---|---|---|
| 首元素 | 簡單 | 已排序陣列退化 O(n²) |
| 隨機元素 | 期望 O(n log n) | 需隨機數生成 |
| 三數取中 | 實務表現優 | 額外比較開銷 |