在输入序列有序时,快排的时间复杂度最大,效率就会很低,所以如果在数据很大并且基本有序的情况下,可以选择随机化快排。
随机化快排代码与普通快排的不同之处:将随机化快排中的随机到的某个数值,记为基准数与第一个数进行交换,变为普通快排的形式,会更易于理解。
代码如下:
#include<stdio.h>
void quick(int a[],int start,int end)
{
if(start>end)
return;
int i=start;
int j=end;
int h=rand()%(end-start+1)+start;
int temp,k;
k=a[h];
//将随机的某个数与第一个交换,下面就与当一个数为基准的方法一致,理解起来会更加的简单
temp=a[start];
a[start]=a[h];
a[h]=temp;
while(i<j)
{
while(i<j&&a[j]>=a[start])
{
j--;
}
while(i<j&&a[i]<=a[start])
{
i++;
}
if(i<j)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
a[start]=a[i];
a[i]=k;
quick(a,start,i-1);
quick(a,i+1,end);
}
int main()
{
int n,i,a[100000];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
quick(a,0,n-1);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}