概述
總體上快排使用分治法的策略。
每一趟做的事情
- 選定一個比較的元素(a[i]), 然后把這個元素拿到臨時變量 ( x ) 中(也稱作把這個元素 x 挖出來 或者在元素的位置( i ) 上挖一個坑)
- 把所有比x小的元素都移到 X 的左邊
- 把所有比x大的元素都移到 X 的右邊
- 遞歸 比 x 小的元素 (0 - i-1)
- 遞歸 比 x 大的元素( i+1 , r )
理解的難點
理解的難點可能在於如何進行2 3 步以及這個坑又是怎樣用的這里。
如下面代碼
- 首先使用 i 作為要挖的坑。
- 從 j 向左找 a[j] 比 x 小的元素
2.1 找到之后把 j的元素挖出來 填到i上,這樣坑i就被填上了,這次留了一個新的坑 j (下次就填這個坑)
2.2 更新 i 的位置 - 從 i 向右找 a[i] 比 x 大的元素
3.1 找到之后把此時的 i 挖出來填到 j 的坑上 這樣坑 j 就被填上了,此時 i 所在的位置是一個新的坑
3.2 更新j的位置
找到最后
- 當 i 的元素填到 j 的時候,i 為坑,j--
- 當 j 的元素填到 i 的時候,j為坑,i++
- 直到 i == j 跳出循環
然后再把最開始拿到的,用來比較的數放到 a[i] 的地方。
a[i] = x
使用代碼
#include <cstdio>
void quick_sort(int a[], int l, int r) {
if (l < r) {
int i = l;
int j = r;
int x = a[i];
while (i < j) {
while (i < j && a[j] > x) {
j--;
}
if (i < j) {
a[i++] = a[j];
}
while (i < j && a[i] < x) {
i++;
}
if (i < j) {
a[j--] = a[i];
}
}
a[i] = x;
quick_sort(a, l, i - 1);
quick_sort(a, i + 1, r);
}
}
int main(void) {
int a[] = {9,8,20,2,11};
quick_sort(a, 0, 4);
for (auto &i : a) {
printf("%d ", i);
}
printf("\n");
return 0;
}
動畫