《算法导论》7.4-5:用插入排序对快速排序进行优化

 当数组几乎有序时,插入排序很快。当快速排序分割到一定小的模块后再对整个数组进行插入排序,来实现对快速排序的优化。确定分割到多大时再进行插入排序合适?

#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.

猜你喜欢

转载自blog.csdn.net/raylrnd/article/details/83932197