快速排序算法和枢轴元素三者取中算法

  1  #include"iostream"
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include <ctime>
  5 using  namespace  std;
  6 
  7 clock_t start;
  8 clock_t End;
  9 
 10 void insertsort(int r[],int s,int t){
 11     int i,j;
 12     for(i=s+1;i<=t;i++){
 13         if(r[i]<r[i-1]){
 14             r[0]=r[i];//将r[i]放到0位置作为空置位 
 15             for(j=i-1;r[0]<r[j];j--){
 16                 r[j+1]=r[j];//从i之前找合适的位置插,没找到就后移 
 17             }
 18             r[j+1]=r[0];//插入到合适的位置 
 19         }
 20     }
 21 }
 22 
 23 void swap(int *r,int low, int high){
 24     int mid = low + ((high - low) >> 1);//计算数组中间的元素的下标     //使用三数取中法选择枢轴    
 25     if (r[mid] > r[high])//目标: r[mid] <= r[high]    
 26     {        
 27     swap(r[mid],r[high]);    
 28     }    
 29     if (r[low] > r[high])//目标: r[low] <= r[high]    
 30     {        
 31     swap(r[low],r[high]);    
 32     }    
 33     if (r[mid] >r[low]) //目标: r[low] >= r[mid]    
 34     {        
 35     swap(r[mid],r[low]);    
 36     }
 37 }
 38 int partition(int *r,int low,int high,int flag){
 39     if(flag==1){//如果是三者取中那么就可以使用交换算法 
 40         swap(r,low,high);
 41     }
 42     r[0]=r[low];
 43     while(low<high){
 44         while(low<high&&r[high]>r[0]){
 45             high--;
 46         }
 47         if(low<high){
 48             r[low]=r[high];
 49             low++;
 50         }
 51         while(low<high&&r[low]<r[0]){
 52             low++;
 53         }
 54         if(low<high){
 55             r[high]=r[low];
 56             high--;
 57         }
 58     }
 59     r[low]=r[0];
 60     return low;
 61 }
 62 void quicksort(int *r,int s,int t,int flag){//快排 
 63     int i;
 64     if(s<t){
 65         if(t-s>=20){//判断子序列是否为小于20的 
 66             i=partition(r,s,t,flag);
 67             quicksort(r,s,i-1,flag);
 68             quicksort(r,i+1,t,flag);
 69         }
 70         else{//如果满足就是使用插入排序 
 71             insertsort(r,s,t);
 72         }
 73     }
 74 }
 75 int main(){
 76     int n,i,k;
 77     double time,time1;
 78     int r[50000],z[50000];
 79     printf("请输入待排序列长度:");
 80     scanf("%d",&n); 
 81     for(i=1;i<=n;i++){
 82         r[i]=rand()%50000;
 83     }
 84     for(i=1;i<=n;i++){
 85         z[i]=r[i];
 86     }
 87     start = clock();
 88     quicksort(r,1,n,0);  //flag=0时为不使用三者取中 
 89     End = clock();
 90     time= ((double)(End - start)) / CLK_TCK;
 91     /*for(k=1;k<=n;k++){
 92         printf("%d ",r[k]);
 93     }*/ 
 94     start = clock();
 95     quicksort(z,1,n,1);   //flag=1时为使用三者取中 
 96     End = clock();
 97     time1= ((double)(End - start)) / CLK_TCK;
 98     /*for(k=1;k<=n;k++){
 99         printf("%d ",z[k]);
100     }*/ 
101     cout << "函数使用三者取中法共用时:" << time1 << "ms" << endl;
102     cout << "函数不使用三者取中法共用时:" <<time<< "ms" << endl;
103     return 0;
104 }

 

posted @ 2020-04-22 20:13  简单记录一下咯  阅读(813)  评论(0编辑  收藏  举报