快速排序算法和枢轴元素三者取中算法
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 }