分治的思想
- 确定分界点x:
q[l], q[r], q[(l+r)/2]随机;
- 调整区间,使得
x左边区间的数 <= x,右边区间的数 >= x;(快排的核心所在)
递归处理左右两段
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
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]; //x:分界点为中间值,i,j:边界左右两侧一个,有偏移量,因为do...while...
while(i < j){ //循环迭代,先移i,j
do i++; while(q[i] < x);
do j--; while(q[i] > x);
if(i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);//递归处理左右两端
}
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &q[i]);
}
quick_sort(q, 0, n - 1);
for(int i = 0; i < n; i++){
printf("%d ", q[i]);
}
return 0;
}