常用排序算法
1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 template <typename T> 7 void printArray(T array[],int arrayLen) 8 { 9 if (arrayLen > 1) 10 { 11 cout<<endl<<"\t\t"; 12 for (int i=0;i<arrayLen;i++) 13 { 14 cout<<array[i]<<" "; 15 } 16 cout<<endl; 17 } 18 return; 19 } 20 21 template <typename T> 22 void randomPerm(T array[],int arrayLen) 23 { 24 if (arrayLen > 1) 25 { 26 T ex; 27 int rand1,rand2; 28 for (int i=0;i<arrayLen; i++) 29 { 30 rand1=rand()%arrayLen; 31 rand2=rand()%arrayLen; 32 if (rand2!=rand1) 33 { 34 ex=array[rand1]; 35 array[rand1]=array[rand2]; 36 array[rand2]=ex; 37 } 38 } 39 } 40 return; 41 } 42 43 template <typename T> 44 void selectSort(T array[],int arrayLen) 45 { 46 if (arrayLen > 1) 47 { 48 T ex; 49 int t; 50 for (int i=1;i<arrayLen-1;i++) 51 { 52 t=i-1; 53 for (int j=i;j<arrayLen;j++) 54 { 55 if (array[j]<array[t]) 56 { 57 t=j; 58 } 59 } 60 if (t==i-1) 61 { 62 continue; 63 } 64 ex=array[t]; 65 array[t]=array[i-1]; 66 array[i-1]=ex; 67 68 } 69 } 70 return; 71 } 72 73 template <typename T> 74 void bubbleSort(T array[],int arrayLen) 75 { 76 if (arrayLen > 1) 77 { 78 bool flag=true; 79 T ex; 80 for (int i=0;i<arrayLen-1 && flag;i++) 81 { 82 flag=false; 83 for (int j=0;j<arrayLen-i-1;j++) 84 { 85 if (array[j]>array[j+1]) 86 { 87 ex=array[j]; 88 array[j]=array[j+1]; 89 array[j+1]=ex; 90 flag=true; 91 } 92 } 93 } 94 } 95 return; 96 } 97 98 template <typename T> 99 void insertSort(T array[],int arrayLen) 100 { 101 if (arrayLen > 1) 102 { 103 T ex; 104 bool flag=true; 105 for (int i=0;i<arrayLen-1&&flag;i++) 106 { 107 flag=false; 108 for (int j=i+1;j>0;j--) 109 { 110 if (array[j]<array[j-1]) 111 { 112 ex=array[j]; 113 array[j]=array[j-1]; 114 array[j-1]=ex; 115 flag=true; 116 } 117 } 118 } 119 } 120 return; 121 } 122 123 template <typename T> 124 void heapSort(T array[],int arrayLen,bool max) 125 { 126 if (arrayLen > 1) 127 { 128 T ex; 129 void (*heap)(T array[],int arrayLen); 130 heap=minHeap; 131 if (max) 132 { 133 heap=maxHeap; 134 } 135 heap(array,arrayLen); 136 for (int i=0;i<arrayLen-1;i++) 137 { 138 ex=array[arrayLen-i-1]; 139 array[arrayLen-i-1]=array[0]; 140 array[0]=ex; 141 heap(array,arrayLen-i-1); 142 } 143 } 144 return; 145 } 146 147 template <typename T> 148 void minHeap(T array[],int arrayLen) 149 { 150 if (arrayLen > 1) 151 { 152 T ex; 153 for (int i=arrayLen/2-1;i>=0;i--) 154 { 155 if ((2*i+1)<arrayLen) 156 { 157 if (array[i]>array[2*i+1]) 158 { 159 ex=array[i]; 160 array[i]=array[2*i+1]; 161 array[2*i+1]=ex; 162 } 163 } 164 if ((2*i+2)<arrayLen) 165 { 166 if (array[i]>array[2*i+2]) 167 { 168 ex=array[i]; 169 array[i]=array[2*i+2]; 170 array[2*i+2]=ex; 171 } 172 } 173 } 174 } 175 return; 176 } 177 178 template <typename T> 179 void maxHeap(T array[],int arrayLen) 180 { 181 if (arrayLen > 1) 182 { 183 T ex; 184 for (int i=arrayLen/2-1;i>=0;i--) 185 { 186 if ((2*i+1)<arrayLen) 187 { 188 if (array[i]<array[2*i+1]) 189 { 190 ex=array[i]; 191 array[i]=array[2*i+1]; 192 array[2*i+1]=ex; 193 } 194 } 195 if ((2*i+2)<arrayLen) 196 { 197 if (array[i]<array[2*i+2]) 198 { 199 ex=array[i]; 200 array[i]=array[2*i+2]; 201 array[2*i+2]=ex; 202 } 203 } 204 } 205 } 206 return; 207 } 208 209 template <typename T> 210 void quikSort(T array[],int start,int end) 211 { 212 if (start < end) 213 { 214 T key=array[end]; 215 int i=start-1,j=start; 216 T ex; 217 while (j<=end-1) 218 { 219 if (array[j]<key) 220 { 221 i++; 222 ex=array[i]; 223 array[i]=array[j]; 224 array[j]=ex; 225 } 226 j++; 227 } 228 ex=array[i+1]; 229 array[i+1]=array[end]; 230 array[end]=ex; 231 quikSort(array,start,i); 232 quikSort(array,i+2,end); 233 } 234 return; 235 } 236 237 template <typename T> 238 void mergeSort(T array[],int start,int end) 239 { 240 if (start < end) 241 { 242 int mid=(start+end)/2; 243 mergeSort(array,start,mid); 244 mergeSort(array,mid+1,end); 245 insertSort(&array[start],end-start+1); 246 //selectSort(&array[start],end-start+1); 247 //printArray(array,10); 248 } 249 } 250 251 template <typename T> 252 void shellSort(T array[],int arrayLen,int seed) 253 { 254 if (seed && arrayLen > 1) 255 { 256 T ex; 257 bool flag=true; 258 for (int i=0;i<arrayLen-seed && flag;i++) 259 { 260 flag=false; 261 for (int j=i+seed;j>0;j-=seed) 262 { 263 if (array[j]<array[j-seed]) 264 { 265 ex=array[j]; 266 array[j]=array[j-seed]; 267 array[j-seed]=ex; 268 flag=true; 269 } 270 } 271 } 272 seed/=2; 273 //printArray(array,10); 274 shellSort(array,arrayLen,seed); 275 } 276 } 277 void main(void) 278 { 279 double array[10]={0.3,3.2,5.7,2.1,4.5,1.9,8.6,7.3,9.4,6.1}; 280 281 cout<<"Select Sort"<<endl; 282 randomPerm(array,10); 283 cout<<"Original array: "; 284 printArray(array,10); 285 selectSort(array,10); 286 cout<<"Sorted array: "; 287 printArray(array,10); 288 cout<<endl; 289 290 cout<<"Bubble Sort"<<endl; 291 randomPerm(array,10); 292 cout<<"Original array: "; 293 printArray(array,10); 294 bubbleSort(array,10); 295 cout<<"Sorted array: "; 296 printArray(array,10); 297 cout<<endl; 298 299 cout<<"Insert Sort"<<endl; 300 randomPerm(array,10); 301 cout<<"Original array: "; 302 printArray(array,10); 303 //insertSort(array,10); 304 shellSort(array,10,1); 305 cout<<"Sorted array: "; 306 printArray(array,10); 307 cout<<endl; 308 309 cout<<"Heap Sort"<<endl; 310 randomPerm(array,10); 311 cout<<"Original array: "; 312 printArray(array,10); 313 heapSort(array,10,true); 314 cout<<"Sorted array: "; 315 printArray(array,10); 316 cout<<endl; 317 318 cout<<"Quik Sort"<<endl; 319 randomPerm(array,10); 320 cout<<"Original array: "; 321 printArray(array,10); 322 quikSort(array,0,9); 323 cout<<"Sorted array: "; 324 printArray(array,10); 325 cout<<endl; 326 327 cout<<"Merge Sort"<<endl; 328 randomPerm(array,10); 329 cout<<"Original array: "; 330 printArray(array,10); 331 mergeSort(array,0,9); 332 cout<<"Sorted array: "; 333 printArray(array,10); 334 cout<<endl; 335 336 cout<<"Shell Sort"<<endl; 337 randomPerm(array,10); 338 cout<<"Original array: "; 339 printArray(array,10); 340 shellSort(array,10,5); 341 cout<<"Sorted array: "; 342 printArray(array,10); 343 cout<<endl; 344 345 printf("%d", sizeof(unsigned short int)); 346 system("pause"); 347 return; 348 }