1 #include <iostream> 2 #include <ctime>//取随机数用时间做种 3 #include <cstdlib> 4 #include <time.h>//计算用时 5 #include <algorithm> 6 #include <stdio.h>//输出文件用 7 #include <iomanip>// 8 using namespace std; 9 int NUM = 100; //要排序的数目 10 int NUM_PER_LINE = 7;//每行输出多少个数 11 void insertion_sort(int *,int ,int); 12 void quickSort(int *p ,int start,int end); 13 void bobbleSort(int *p ,int start,int end); 14 void selectSort(int *p ,int start ,int end); 15 int * makeRandom();//产生随机数组 16 void printUseTime(int*,int ,int ,int);//打印用的时间 17 void print(int *);//打印原数组 18 void importNUM();//输入要排序的个数 19 void chooseMode();//选择要用哪种排序 20 int main() 21 { 22 importNUM(); //输入要排序的个数 23 chooseMode(); //选择要用哪种排序 24 return 0; 25 } 26 //插入排序 27 void insertion_sort(int *p,int start,int end) 28 { 29 int temp; 30 int i,j; 31 for (i =start+1; i < end; i++) 32 { 33 j = i-1; 34 temp = p[i]; 35 while ( j >=start && p[j] > temp) 36 { 37 p[j+1] = p[j]; 38 j--; 39 } 40 p[j+1] = temp; 41 } 42 } 43 //快速排序 44 void quickSort(int *p ,int start,int end) 45 { 46 int i = start , j = end; 47 int base = p[i];//选取第一个作为基数 48 int dig = i;//挖的坑 49 while( i!= j) 50 { 51 while (p[j] >= base && j > i) 52 { 53 j--; 54 } 55 p[dig] = p[j]; 56 dig = j; 57 while (p[i] <= base && j> i) 58 { 59 i++; 60 } 61 p[dig] = p[i]; 62 dig = i; 63 } 64 p[dig] = base; 65 if(start < dig-1) 66 quickSort(p,start,dig-1); 67 if(dig+1 < end) 68 quickSort(p,dig+1,end); 69 } 70 //冒泡排序 71 void bobbleSort(int *p ,int start,int end) 72 { 73 int temp; 74 for (int i = start; i < end-1 ;i++) 75 for (int j =start; j < end -i-1 ;j++) 76 { 77 if (p[j] > p[j+1]) 78 { 79 temp = p[j]; 80 p[j] = p[j+1]; 81 p[j+1] = temp; 82 } 83 } 84 } 85 //选择排序 86 void selectSort(int *p ,int start ,int end) 87 { 88 for (int i =start; i < end -1 ;i++) 89 { 90 int min = i+1,temp; 91 for (int j = i+1 ; j < end;j++) 92 { 93 if(p[min] > p[j]) 94 { 95 min = j; 96 } 97 } 98 if (p[min] < p[i]) 99 { 100 temp = p[i]; 101 p[i] = p[min]; 102 p[min] = temp; 103 } 104 } 105 } 106 void print(int *p) 107 { 108 int numPerLine = NUM_PER_LINE; 109 for (int i = 0; i < NUM ;i++) 110 { 111 cout<<" "<<setw(8)<<p[i]; 112 if(--numPerLine == 0) 113 { 114 cout<<endl; 115 numPerLine += NUM_PER_LINE; 116 } 117 } 118 } 119 int * makeRandom() 120 { 121 srand(unsigned(time(0)));//做种子 122 int *p = new int[NUM]; 123 for (int i = 0; i < NUM; i++) 124 { 125 p[i] = (int)rand(); 126 } 127 return p; 128 } 129 void printUseTime(int*p,int start ,int end ,int mode) 130 { 131 int *v = new int[NUM]; 132 for (int i = 0; i < NUM; i++) 133 v[i] = p[i]; 134 switch (mode) 135 { 136 case 0: 137 { 138 double formerTime = clock(); 139 insertion_sort(v,start,end); 140 cout<<"插入排序共用时"<<clock() - formerTime<<"毫秒\n"; 141 break; 142 } 143 case 1: 144 { 145 double formerTime = clock(); 146 quickSort(v,start,end); 147 cout<<"快速排序共用时"<<clock() - formerTime<<"毫秒\n"; 148 break; 149 } 150 case 2: 151 { 152 double formerTime = clock(); 153 bobbleSort(v,start,end); 154 cout<<"冒泡排序共用时"<<clock() - formerTime<<"毫秒\n"; 155 break; 156 } 157 case 3: 158 { 159 double formerTime = clock(); 160 selectSort(v,start,end); 161 cout<<"选择排序共用时"<<clock() - formerTime<<"毫秒\n"; 162 } 163 default: 164 break; 165 } 166 //delete [] v; 167 } 168 void importNUM() 169 { 170 cout<<"请输入要排序的个数\n"; 171 cin>>NUM; 172 } 173 void chooseMode()//选择要用哪种排序 174 { 175 int * p = makeRandom();//产生随机数组 176 int switch_on; 177 cout<<"请输入要选择哪种排序?\n"; 178 cout<<"0.插入排序\n"; 179 cout<<"1.快速排序\n"; 180 cout<<"2.冒泡排序\n"; 181 cout<<"3.选择排序\n"; 182 cout<<"4.全都排一遍\n"; 183 cin>>switch_on; 184 if(switch_on == 4) 185 for (int i = 0 ;i < 4; i++) 186 printUseTime(p,0,NUM,i); 187 else 188 printUseTime(p,0,NUM,switch_on); 189 delete []p; 190 }
浙公网安备 33010602011771号