函數直接或間接調用自身。必須包含:
1. 基線條件:終止遞歸
2. 遞歸步驟:將問題縮小為子問題
key = a[low])left 從左找 ≥key,right 從右找 ≤key,交換key#includevoid QuickSort(int a[], int low, int high) { if (low >= high) return; // 基線條件 int key = a[low]; int left = low, right = high; while (left < right) { while (left < right && a[right] >= key) --right; a[left] = a[right]; while (left < right && a[left] <= key) ++left; a[right] = a[left]; } a[left] = key; // 放置樞軸 QuickSort(a, low, left-1); // 左子數組 QuickSort(a, left+1, high); // 右子數組 } int main() { int a[] = {32, 8, 65, 18, 19, 12, 61}; QuickSort(a, 0, 6); for (int i=0; i<7; ++i) printf("%4d", a[i]); return 0; }
QuickSort(0,6) key=32 ├─ 分區後:[8,18,19,12] 32 [65,61] ├─ QuickSort(0,3) key=8 │ ├─ 分區:[] 8 [18,19,12] │ ├─ QuickSort(0,-1) 返回 │ └─ QuickSort(1,3) key=18 ... └─ QuickSort(5,6) key=65 ...
| 特性 | 遞歸 | 迭代 |
|---|---|---|
| 可讀性 | 高(符合問題定義) | 較低 |
| 空間 | 調用棧 O(深度) | 顯式變量 O(1) |
| 性能 | 函數調用開銷 | 通常更快 |
| 適用場景 | 分治、樹圖遍歷、回溯 | 簡單線性循環 |