void quicksort(int a[], int l, int h) {
if (l >= h) return;
int i = l, j = h;
int key = a[i]; // 選最左作基準
while (i < j) {
while (i < j && a[j] > key) j--; // 從右找 ≤ key
if (i < j) a[i++] = a[j]; // 填坑,i 右移
while (i < j && a[i] < key) i++; // 從左找 ≥ key
if (i < j) a[j--] = a[i]; // 填坑,j 左移
}
a[i] = key; // 基準歸位
quicksort(a, l, i - 1);
quicksort(a, i + 1, h);
}
key 保存基準,空出 a[i] 做第一個坑,交替從右左填坑,最終 i==j 為基準歸位點i < j 保證不越界,遞歸終止條件 l >= h
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
qsort(arr, n, sizeof(int), cmp);
qsort 使用快速排序變體(通常為內省排序:快排+堆排+插排混合),保證 O(n log n) 最壞情況,支持任意類型通過比較函數。
| 指標 | 平均 | 最好 | 最壞 | 空間 |
|---|---|---|---|---|
| 時間複雜度 | O(n log n) | O(n log n) | O(n²) | O(log n) 遞歸棧 |
快排是「原地、分治、不穩定」排序的代表,理解其分區邏輯與遞歸結構是掌握高級排序算法的基石。