概述
总体上快排使用分治法的策略。
每一趟做的事情
- 选定一个比较的元素(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;
}
动画