在遇到排序时大部分人铁定会想到“冒泡法”,“选择法”。而当我们遇到
超多(一般个数大于两位)的数字并且要在超短的时间里(一般少于1000ms)完成排序时,如果再用“冒泡”,“选择".那么,各位就接受你的屏幕上显示的”TLE"吧!在这时我们应当选择“快速排序法"简称“快排”。
而说到快拍,相信很多人会想到sort()函数,但是在一些时候,STL函数是不允许使用的。所以呢,大家还是要老老实实的学会”快排法“以应对这一大拨排序题。而说到这个函数,要注意这个函数为递归函数。当然,写法不止一种。但是,这些所有地方法都用到了递归的想法:或是递归自身,抑或间接递归。但是,在递归自身时一定要注意在函数中一定要有结束标志(return ;)
递归自身:
void ll(int a[],int l,int r)
{
int i,j,k;
k=a[l];
i=l;
j=r;
if(i>=j)
return ;//结束函数
while(i<j)
{
while(i<j&&a[j]>=k)
j--;
a[i]=a[j];
while(i<j&&a[i]<=k)
i++;
}
a[i]=k;
ll(a,l,i-1);
ll(a,i+1,r);
}
间接递归:
int change(int,int);
void qfinal(int,int);
int a[1000001]={0};
int change(int t,int w)
{
int bj=0;
bj=a[t];
while(t<w)
{
while(t<w&&a[w]>=bj)
{
w--;
}
a[t]=a[w];
while(t<w&&a[t]<=bj)
{
t++;
}
a[w]=a[t];
}
a[t]=bj;
return t;
}
void qfinal(int l,int s)
{
int p;
if(l<s)
{
p=change(l,s);
qfinal(l,p-1);
qfinal(p+1,s);
}
}