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 }