插入排序最终版本:

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 }

 

posted on 2013-03-17 12:43  particle  阅读(245)  评论(0编辑  收藏  举报