《演算法導論》7.4-5:用插入排序對快速排序進行優化
阿新 • • 發佈:2018-12-20
當陣列幾乎有序時,插入排序很快。當快速排序分割到一定小的模組後再對整個陣列進行插入排序,來實現對快速排序的優化。確定分割到多大時再進行插入排序合適?
#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.