我打算复习下快排模版,结果怎么写都写不对,贼离谱,后来发现是自己犯了一个很弱智的错误,想取bas作为随机下边然后把a[bas]作为基准,但问题在于,我把c数组赋值给a数组这步省略成了把基准赋值给a[bas]了。。这固然是节约空间的好思路,但问题在于我此前错把一个可能被修改的量当成常量来用了,结果a[bas]被偷偷中途修改了我却还当成他是原来的那个数,就离谱,下次一定要常量化,所有常量都要写死成const,这有助于排错..
不然就会犯我这个弱智错误...
Code
#include <iostream>
#include <cstdlib>
using namespace std;
int a[100000+5],b[100000+5],c[100000+5],d[100000+5],n;
int random(int l,int r){return rand()%(r-l+1)+l;}
void quicksort(int l,int r)
{
if(l>=r)return;
int bas=a[random(l,r)],bp=0,cp=0,dp=0;
for(int i=l;i<=r;i++)
{
if(a[i]==bas)cp++;
else if(a[i]<bas)b[bp++]=a[i];
else d[dp++]=a[i];
}
for(int i=0;i<bp;i++)a[l+i]=b[i];
for(int i=0;i<cp;i++)a[l+bp+i]=bas;
for(int i=0;i<dp;i++)a[l+bp+cp+i]=d[i];
quicksort(l,l+bp-1);
quicksort(l+bp+cp,r);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
srand(time(NULL));
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
quicksort(1,n);
for(int i=1;i<=n;i++)cout<<a[i]<<' ';
return 0;
}
标签:bas,int,模版,random,快排,100000
From: https://www.cnblogs.com/gongkai/p/17846686.html