当数组几乎有序时,插入排序很快。当快速排序分割到一定小的模块后再对整个数组进行插入排序,来实现对快速排序的优化。确定分割到多大时再进行插入排序合适?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void INSERTSORT(int A[],int p,int r){
int i,j,key;
for(j=p;j<=r;j++){
key=A[j];
i=j-1;
while(i>0&&A[i]>key){
A[i+1]=A[i];
i--;
}
A[i+1]=key;
}
}
int PARTITION(int A[],int p,int r){
int x=A[r];
int temp;
int i=p-1;
for(int j=p;j<=r-1;j++){
if(A[j]<=x){
i++;
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
temp=A[i+1];
A[i+1]=A[r];
A[r]=temp;
return i+1;
}
void QUICKSORT(int A[],int p,int r,int k){
int q;
if(r-p>k){
q=PARTITION(A,p,r);
QUICKSORT(A,p,q-1,k);
QUICKSORT(A,q+1,r,k);
}
}
int main(){
clock_t start,end;
int A[100000],B[100000];
int i,k=10;
for(i=0;i<=99999;i++){
A[i]=rand()%100000+1;
B[i]=A[i];
}
double min_time = 10000.0;
int temp_k = 0;
for(int k=0;k<=200;k++){
for(i=0;i<=99999;i++){
A[i]=B[i];
}
start=clock();
QUICKSORT(A,0,99999,k);
INSERTSORT(A,0,99999);
end=clock();
double t = (end-start)*0.001;
printf("k=%d\t%fsecond\t",k,t);
if(t < min_time) {
min_time = t;
temp_k = k;
}
}
printf("min_K:k=%d\t MIN_TIME:%fsecond\t",temp_k,min_time);
}
总结:可以看出当k=27时,运行时间最小(k = 1~200)。即当快速排序子模块分割到27个数的时候,对整体进行插入排序,此时效果最好。考虑到运行时间问题,并没有把k设置成1-99999.