AcWing 785. 快速排序
原题链接
简单
作者:
ranba
,
2020-03-01 10:00:20
,
所有人可见
,
阅读 681
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int q[N];
int n;
void quick_sort(int q[], int l, int r){
if(l == r) return;
//分界点可以选择左边界、中间点、右边界、或者随机位置;
//建议选择中间点或者随机位置,时间复杂度的期望值是nlogn,
//否则在特殊情况下,时间复杂度会达到n^2,导致运行超时
int x = q[l + r >> 1];
//后面的代码里,我们是先移动指针再判断大小,所以开始把两指针指向边界的两侧
int i = l - 1, j = r + 1;
//目的:把整个区间分成两段,使得左区间数值全部小于等于x,右区间数值全部大于等于x
//注意:分段后,原先分界点的值x可能会移动位置
//双指针i,j不断靠近,直到相遇或穿过
while (i < j){
do i++; while (q[i] < x);
do j--; while (q[j] > x);
//如果指针没有相遇,则交换两个数
if (i < j) swap(q[i], q[j]);
}
//递归,继续处理左右两个区间
//注意:如果递归时用指针j,则分界点不能取右边界,否则可能会死循环
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main(){
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;
}