快速排序是冒泡排序的改進:分治策略。一趟分區將陣列分為左右兩部分,左側鍵值 ≤ 樞軸,右側 ≥ 樞軸,遞迴排序兩部分。平均 O(n log n),最差 O(n²)(已有序陣列),空間 O(log n) 堆疊。
private void Swap(ref int a, ref int b) { int t = a; a = b; b = t; }
public void QuickSort(int[] arr, int low, int high)
{
if (high <= low) return;
if (high == low + 1) { if (arr[low] > arr[high]) Swap(ref arr[low], ref arr[high]); return; }
int mid = (low + high) >> 1;
int pivot = arr[mid];
Swap(ref arr[low], ref arr[mid]); // 樞軸移至低端
int l = low + 1, r = high;
do
{
while (l <= r && arr[l] < pivot) l++;
while (arr[r] >= pivot) r--;
if (l < r) Swap(ref arr[l], ref arr[r]);
} while (l < r);
arr[low] = arr[r];
arr[r] = pivot;
if (low + 1 < r) QuickSort(arr, low, r - 1);
if (r + 1 < high) QuickSort(arr, r + 1, high);
}
mid),避免已序列最差情況;可改用「三數取中」或隨機化。l 找 ≥ pivot,r 找 < pivot,交換錯位元素;最終 r 為模軸正確位置。<pivot | =pivot | >pivot,大量重複鍵值時極快(荷蘭國旗問題)。Parallel.Invoke 並行排序左右分區(大陣列有效)。生產代碼優先使用 Array.Sort/List.Sort(Introspective Sort:快排+堆排+插排混合),穩定、高效、經過極致優化。