1. 程式人生 > >《演算法導論》7.4-5:用插入排序對快速排序進行優化

《演算法導論》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.