快排模版

发布时间 2023-11-21 15:33:55作者: Kai-G

我打算复习下快排模版,结果怎么写都写不对,贼离谱,后来发现是自己犯了一个很弱智的错误,想取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;
}