编程珠玑Column11中插入排序和快排序

插入排序最终版本:

insertion sort

快排序最终版本:

quick sort
 1 int cutoff=10;//瞎定义的

 2 

 3 void quick_sort1(int l,int u)

 4 {

 5     if(u-l<cutoff)

 6         return ;

 7     int p=l+rand()%(u-l+1);//防止sorted sequence

 8     int tmp=arr[l];arr[l]=arr[p];arr[p]=tmp;

 9     int i=l,j=u+1;

10     int t=arr[l];

11     for(;;)

12     {

13         do{++i;}while(i<=u&&arr[i]<t);//防止identical sequence

14         do{--j;}while(arr[j]>t);

15         if(i>=j)//原书中是i>j,实际i>=j即可,可以少一遍循环

16             break;

17         tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;

18     }

19     arr[l]=arr[j];arr[j]=t;

20     quick_sort1(l,j-1);

21     quick_sort1(j+1,u);

22 }

23 

24 void quick_sort(int l,int u)

25 {

26     quick_sort1(l,u);

27     insert_sort(l,u);

28 }

测试程序:

test
 1 #define MAX 10000

 2 typedef void Func(int,int);

 3 int arr[MAX];

 4 

 5 int main()

 6 {

 7     int n;

 8 

 9     struct timeval begin,end;

10     Func *func_arr[]={&insert_sort,&quick_sort};

11     for(int k=0;k<2;++k)

12     {

13         n=100;

14         gettimeofday(&begin,NULL);

15         while(n--)

16         {

17             srand(time(NULL));

18             for(int i=0;i<MAX;++i)

19                 arr[i]=rand()%MAX;//构造随机数组

20             func_arr[k](0,MAX-1);

21             for(int i=0;i<MAX-1;++i)//正确性检查

22                 assert(arr[i]<=arr[i+1]);

23         }

24         gettimeofday(&end,NULL);

25         int val=end.tv_sec-begin.tv_sec;//计算时间

26         cout<<"sort"<<k<<":"<<val<<endl;

27     }

28 }

 

你可能感兴趣的:(column)