void QuickSort(int left, int right) {
if (left >= right) return;
int pivot = a[left];
int i = left, j = right;
while (i != j) {
while (a[j] >= pivot && i < j) j--;
while (a[i] <= pivot && i < j) i++;
if (i < j) { int t=a[i]; a[i]=a[j]; a[j]=t; }
}
a[left] = a[i]; a[i] = pivot;
QuickSort(left, i-1);
QuickSort(i+1, right);
}
特點:雙指針向中間收斂,基準值最終歸位 i。
void quickSort2(int x[], int l, int r) {
if (l >= r) return;
int m = l;
for (int i = l+1; i <= r; i++)
if (x[i] < x[l]) { m++; int t=x[m]; x[m]=x[i]; x[i]=t; }
int t = x[l]; x[l] = x[m]; x[m] = t;
quickSort2(x, l, m-1);
quickSort2(x, m+1, r);
}
void swap2(int &a, int &b) { // C++ 參考,C 用指標
if (&a == &b) return;
a ^= b; b ^= a; a ^= b;
}
特點:單指針 m 維護「小於基準區」邊界,代碼更簡潔。
| 維度 | 雙向掃描 | 單向掃描 |
|---|---|---|
| 交換次數 | 較少 | 較多 |
| 代碼長度 | 較長 | 極短 |
| 基準值選取 | 固定 left | 固定 left |
| 最壞情況 | 有序陣列 O(n²) | 有序陣列 O(n²) |