i = L, j = R,將基準數 x = a[L] 挖出形成第一個坑j-- 從右向左找 小於 x 的數,填入 a[i],形成新坑位於 ji++ 從左向右找 大於等於 x 的數,填入 a[j],形成新坑位於 ii == j,將基準數 x 填入 a[i]#include
#include
void quick_sort(int s[], int l, int r);
int main(void) {
int a[10] = {20, 8, 10, 27, 9, 22, 24, 7, 15, 55};
quick_sort(a, 0, 9);
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
void quick_sort(int s[], int l, int r) {
if (l < r) {
int i = l, j = r, x = s[l];
while (i < j) {
while (i < j && s[j] >= x) j--;
if (i < j) s[i++] = s[j];
while (i < j && s[i] < x) i++;
if (i < j) s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1);
quick_sort(s, i + 1, r);
}
}
s[j] >= x、s[i] < x 保證相等元素聚右側,穩定性視實現而定l >= r 即區間長度 ≤ 1| 情況 | 時間複雜度 | 空間複雜度 |
|---|---|---|
| 平均 | O(n log n) | O(log n) |
| 最好 | O(n log n) | O(log n) |
| 最壞 | O(n²) | O(n) |
快速排序是實務中最常用的內部排序算法,理解其分區邏輯與遞歸結構,是演算法面試與系統開發的必修課。