1 #include<iostream> 2 #include<time.h> 3 using namespace std; 4 /* 5 简单插入排序: 6 最差时间复杂度:O(n^2) 7 平均时间复杂度:O(n^2) 8 */ 9 void Insertion_Sort(int *a,int n) 10 { 11 int i,j; 12 for(i=2;i<=n;i++) 13 if(a[i]<a[i-1]) 14 { 15 a[0]=a[i]; 16 for(j=i-1;a[j]>a[0];j--) 17 a[j+1]=a[j]; 18 a[j+1]=a[0]; 19 } 20 } 21 /* 22 折半插入排序: 23 最差时间复杂度:O(n^2) 24 平均时间复杂度:O(n^2) 25 */ 26 void Bin_Sort(int *a,int n) 27 { 28 int i,j,low,mid,high; 29 for(i=2;i<=n;i++) 30 if(a[i]<a[i-1]) 31 { 32 a[0]=a[i]; 33 low=1; 34 high=i-1; 35 while(low<=high) 36 { 37 mid=(low+high)/2; 38 if(a[mid]>a[0]) 39 high=mid-1; 40 else 41 low=mid+1; 42 } 43 for(j=i-1;j>high;j--) 44 a[j+1]=a[j]; 45 a[high+1]=a[0]; 46 } 47 } 48 /*选择排序: 49 最差时间复杂度:O(n^2) 50 平均时间复杂度:O(n^2) 51 */ 52 void Selection_Sort(int *a,int n) 53 { 54 int i,j,k; 55 for(i=1;i<n;i++) 56 { 57 k=i; 58 for(j=i+1;j<=n;j++) 59 if(a[k]>a[j]) 60 k=j; 61 if(k!=i) 62 swap(a[k],a[i]); 63 } 64 } 65 /*快速排序 66 最差时间复杂度:O(n^2) 67 平均时间复杂度:O(nlogn) 68 */ 69 void Quick_Sort(int *a,int low,int high) 70 { 71 int i=low,j=high; 72 a[0]=a[low]; 73 while(low<high) 74 { 75 while(low<high && a[high]>=a[0]) 76 high--; 77 swap(a[low],a[high]); 78 while(low<high && a[low]<=a[0]) 79 low++; 80 swap(a[low],a[high]); 81 } 82 a[low]=a[0]; 83 if(i!=low) 84 Quick_Sort(a,i,low-1); 85 if(j!=high) 86 Quick_Sort(a,high+1,j); 87 } 88 /*冒泡排序 89 最差时间复杂度:O(n^2) 90 平均时间复杂度:O(n^2) 91 */ 92 void Bubble_Sort(int *a,int n) 93 { 94 int i; 95 bool change=true; 96 while(change) 97 { 98 change=false; 99 for(i=1;i<n;i++) 100 if(a[i]>a[i+1]) 101 { 102 change=true; 103 swap(a[i],a[i+1]); 104 } 105 } 106 } 107 /*鸡尾酒排序(双向冒泡排序): 108 最差时间复杂度:O(n^2)) 109 平均时间复杂度:O(n^2) 110 */ 111 void Cocktail_Sort(int *a,int n) 112 { 113 int i; 114 int left=1,right=n; 115 bool change=true; 116 while(change) 117 { 118 change=false; 119 for(i=left;i<right;i++) 120 if(a[i]>a[i+1]) 121 { 122 change=true; 123 swap(a[i],a[i+1]); 124 } 125 right--; 126 for(i=right;i>left;i--) 127 if(a[i]<a[i-1]) 128 { 129 change=true; 130 swap(a[i],a[i-1]); 131 } 132 left++; 133 } 134 } 135 /*堆排序 136 最差时间复杂度:O(nlogn) 137 平均时间复杂度:O(nlogn) 138 */ 139 void Heap_Adjust(int *a,int low,int high) 140 { 141 int i; 142 a[0]=a[low]; 143 for(i=2*low;i<=high;i*=2) 144 { 145 if(i<high && a[i]<a[i+1]) 146 i++; 147 if(a[0]>=a[i]) 148 break; 149 else 150 { 151 a[low]=a[i]; 152 low=i; 153 } 154 a[low]=a[0]; 155 } 156 } 157 void Heap_Sort(int *a,int n) 158 { 159 int i; 160 for(i=n/2;i>=1;i--) 161 Heap_Adjust(a,i,n); 162 for(i=n;i>=2;i--) 163 { 164 swap(a[1],a[i]); 165 Heap_Adjust(a,1,i-1); 166 } 167 } 168 /* 169 希尔排序 170 最差时间复杂度:O(n^2) 171 平均时间复杂度:O(n^1.3) 172 */ 173 void Shell_Sort(int *a,int n) 174 { 175 int i,j; 176 int gap=n/2; 177 while(gap) 178 { 179 for(i=gap+1;i<=n;i++) 180 if(a[i]<a[i-gap]) 181 { 182 a[0]=a[i]; 183 for(j=i-gap;j>0 && a[j]>a[0];j-=gap) 184 a[j+gap]=a[j]; 185 a[j+gap]=a[0]; 186 } 187 gap/=2; 188 } 189 } 190 /* 191 计数排序: 192 最差时间复杂度:O(n+k) 193 平均时间复杂度:O(n+k) 194 */ 195 void Counting_Sort(int *a,int n) 196 { 197 int i; 198 int max=a[1]; 199 for(i=2;i<=n;i++) 200 { 201 if(max<a[i]) 202 max=a[i]; 203 } 204 int *mark=new int[max+1]; 205 memset(mark,0,sizeof(int)*(max+1)); 206 for(i=1;i<=n;i++) 207 mark[a[i]]++; 208 for(i=1;i<=max;i++) 209 mark[i]+=mark[i-1]; 210 int *p=new int[n+1]; 211 memset(p,0,sizeof(int)*(n+1)); 212 for(i=1;i<=n;i++) 213 { 214 p[mark[a[i]]]=a[i]; 215 mark[a[i]]--; 216 } 217 for(i=1;i<=n;i++) 218 a[i]=p[i]; 219 } 220 /* 221 鸽巢排序: 222 最差时间复杂度:O(n+N) 223 平均时间复杂度:O(n+N) 224 */ 225 void Pigeonhole_Sort(int *a,int n) 226 { 227 int i,j,k=1; 228 int max=a[1]; 229 for(i=2;i<=n;i++) 230 { 231 if(max<a[i]) 232 max=a[i]; 233 } 234 int *mark=new int[max+1]; 235 memset(mark,0,sizeof(int)*(max+1)); 236 for(i=1;i<=n;i++) 237 mark[a[i]]++; 238 for(i=1;i<=max;i++) 239 for(j=1;j<=mark[i];j++) 240 a[k++]=i; 241 } 242 /* 243 归并排序: 244 最差时间复杂度:O(nlogn) 245 平均时间复杂度:O(nlogn) 246 */ 247 void Merge(int *a,int low,int mid,int high) 248 { 249 int p,i=low,j=mid+1,k=low; 250 int *temp=new int[high+1]; 251 memset(temp,0,sizeof(int)*(high+1)); 252 for(;i<=mid && j<=high;k++) 253 if(a[i]<a[j]) 254 temp[k]=a[i++]; 255 else 256 temp[k]=a[j++]; 257 if(i<=mid) 258 for(p=0;p<=mid-i;p++) 259 temp[k+p]=a[i+p]; 260 if(j<=high) 261 for(p=0;p<=high-j;p++) 262 temp[k+p]=a[j+p]; 263 for(p=low;p<=high;p++) 264 a[p]=temp[p]; 265 } 266 void MSort(int *a,int low,int high) 267 { 268 if(low<high) 269 { 270 int mid=(low+high)/2; 271 MSort(a,low,mid); 272 MSort(a,mid+1,high); 273 Merge(a,low,mid,high); 274 } 275 } 276 /* 277 梳排序: 278 最差时间复杂度:O(nlogn) 279 平均时间复杂度:O(nlogn) 280 */ 281 void Comb_Sort(int *a,int n) 282 { 283 int i; 284 int gap=n; 285 while(gap/=1.3) 286 { 287 for(i=gap+1;i<=n;i++) 288 if(a[i]<a[i-gap]) 289 swap(a[i],a[i-gap]); 290 } 291 } 292 /* 293 奇偶排序(砖排序): 294 最差时间复杂度:O(n^2) 295 平均时间复杂度:O(n^2) 296 */ 297 void Odd_Even(int *a,int n) 298 { 299 int i; 300 bool change=true; 301 while(change) 302 { 303 change=false; 304 for(i=1;i<n;i+=2) 305 if(a[i]>a[i+1]) 306 { 307 change=true; 308 swap(a[i],a[i+1]); 309 } 310 for(i=2;i<n;i+=2) 311 if(a[i]>a[i+1]) 312 { 313 change=true; 314 swap(a[i],a[i+1]); 315 } 316 } 317 } 318 /* 319 地精排序(侏儒排序): 320 最差时间复杂度:O(n^2) 321 平均时间复杂度:O(n^2) 322 */ 323 void Gnome_Sort(int *a,int n) 324 { 325 int i=0; 326 while(i<n) 327 { 328 if(i<=0 || (i>=1 && a[i]<=a[i+1])) 329 i++; 330 else 331 { 332 swap(a[i],a[i+1]); 333 i--; 334 } 335 } 336 } 337 void Out(int *a,int n) 338 { 339 int i; 340 for(i=1;i<=n;i++) 341 cout<<a[i]<<" "; 342 cout<<endl; 343 } 344 int main() 345 { 346 srand((unsigned)time(NULL)); 347 int *p=new int[16]; 348 memset(p,0,sizeof(int)*16); 349 for(int i=1;i<=15;i++) 350 { 351 p[i]=rand()%100; 352 } 353 Out(p,15); 354 //Insertion_Sort(p,15); 355 //Bin_Sort(p,15); 356 //Selection_Sort(p,15); 357 //Quick_Sort(p,1,15); 358 //Bubble_Sort(p,15); 359 //Cocktail_Sort(p,15); 360 //Heap_Sort(p,15); 361 //Shell_Sort(p,15); 362 //Counting_Sort(p,15); 363 //Pigeonhole_Sort(p,15); 364 //Comb_Sort(p,15); 365 //Odd_Even(p,15); 366 //MSort(p,1,15); 367 Gnome_Sort(p,15); 368 Out(p,15); 369 }