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 }