AcWing 785. 快速排序
原题链接
简单
作者:
一只鳄鱼
,
2021-07-17 12:58:25
,
所有人可见
,
阅读 166
//三组:顺序:小于x,x,大于x。则只看1、3组,x随风飘摇
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int n;
int q[maxn];
void quick_sort(int q[],int l,int r)
{
if(l>=r) return ;
int x=q[(l+r)/2];
int i=l-1,j=r+1;
while(i<j)
{
do i++;while(q[i]<x);//一直到不符合1组
do j--;while(q[j]>x);//一直到不符合3组
if(i<j) swap(q[i],q[j]);//既然停住了就交换,除了x以外其他的都是把归位到1、3组
//如果正好停到了x就不管它,爱换不换。若一个是x一个不是,必须让不是的归位!!
//反正最后该归位的都归位了,x也会被挤到该在的位置上
//有可能比较猛了i,j逆位,这时候就不换
}
quick_sort(q,l,j),quick_sort(q,j+1,r);
//最后退出一定是i,j逆位了或i==j
//但是j必然停在第一组里的最后一个或者x上,于是可以分为[l,j],[j+1.r]
//同理i必然停在第二组的第一个或者x上,但是这时需要将k置为(l+r+1)/2;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&q[i]);
}
quick_sort(q,1,n);
for(int i=1;i<=n;i++) printf("%d ",q[i]);
}