14种排序

  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 }

原文链接:http://www.oschina.net/code/snippet_564140_12720

posted @ 2012-08-25 21:41  山路水桥  阅读(181)  评论(0编辑  收藏  举报