愿天下的每个OIer都被善待
不讲原理了,不证复杂度了,上代码:
#include<iostream>
#include<cstdlib>
using namespace std;
void qsort(int* begin,int* end){//区间左闭右开
if(begin>=end)return;//没有元素还排个寄
int mid=*(begin+rand()%(end-begin));//随机边界,大样本容量下容易选到靠中间的值作为分界
int *l=begin,*r=end-1;//左右指针
while(l<=r){
while(*l<mid)//找到从左数一个大于等于mid的
l++;
while(*r>mid)//找到从右数一个小于等于mid的
r--;
if(l<=r){//能换?
swap(*l,*r);//就换
l++;//下一个,否则
r--;//就会死循环
}
}
qsort(begin,r+1);//递归左区间
qsort(l,end);//递归右区间
}
int a[100005];
int n;
int main(){
srand(time(0));//随机种子
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
qsort(a,a+n);
for(int i=0;i<n;i++)cout<<a[i]<<' ';
return 0;
}