快速排序属于分治算法,分治算法都有三个步骤:
1.分成子问题
2.递归处理子问题
3.子问题合并
由此,我们便可以容易理解快速排序的步骤:
1.确定分界点 x :二分之一位置或任意位置
2.调整区间:使x左边的数都 <=x, x右边的数都 >=x
3.递归处理左右两段
快排模板如下:
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n;
int q[N];
//快速排序
void quick_sort(int q[], int l, int r) {
//递归终止条件
if (l >= r) return;
//确定分界点 处理子问题
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j) {
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j) {
swap(q[i], q[j]);
//其他语言没有swap()函数时 要自己写
/*int t=q[i];
q[i]=q[j];
q[j]=t;*/
}
}
//递归处理子问题
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main() {
scanf("%d", &n);
for (int k = 0; k < n; k++) scanf("%d", &q[k]);
quick_sort(q, 0, n - 1);
for (int k = 0; k < n; k++) printf("%d ", q[k]);
return 0;
}