内排序—数组实现(c++)

  1 参考资料:数据结构与算法分析(第三版)(c++  2           http://blog.csdn.net/theprinceofelf/article/details/6672677  
  3             
  4             
  5             
  6             
  7     内排序,均采用数组实现,数组有较多的局限性,这些实现是为了去了解排序算法  
  8 的操作流程  
  9   
 10 #include<iostream>  
 11 using namespace std;  
 12   
 13 void Swap(int &a,int &b);  
 14 void Print(int *array,int n);  
 15 void BubbleSort(int *array,int n);   
 16 void InsertSort(int *array,int n);   
 17 void ShellSort(int *array,int n);  
 18 void RadixSort(int *array,int n,int k,int r,int *cnt,int *B);  
 19 void QuickSort(int Left,int Right,int *array);   
 20 int FindPos(int Left,int Right);  
 21 int Parttion(int Left,int Right,int& pos,int *A);  
 22 void MergeSort(int Left,int Right,int *array,int *B);  
 23 void ShellSort(int *array,int n);  
 24 void IssSort(int *array,int n,int temp);  
 25 void HeapSort(int *array,int n);  
 26 void HeapAdjust(int *array,int high,int low);  
 27 int main()  
 28 {  
 29     int n=20;  
 30     int arry[n]={12,45,78,2,3,45,12,47,36,5,112,1178,14,20,10,58,74,65,24,17};  
 31     //这两个数组主要是在用数组实现基数排序过程中要使用到   
 32     int cnt[n];  
 33     int B[n];  
 34       
 35     printf("要进行排序的数组为:\n");  
 36     Print(arry,n);  
 37       
 38       
 39     printf("冒泡排序:\n");  
 40     BubbleSort(arry,n);  
 41     Print(arry,n);  
 42     printf("插入排序:\n");  
 43     InsertSort(arry,n);  
 44     Print(arry,n);  
 45     printf("基数排序:\n");  
 46     RadixSort(arry,n,4,10,cnt,B);  
 47     Print(arry,n);  
 48     printf("快速排序:\n");  
 49     QuickSort(0,n-1,arry);  
 50     Print(arry,n);  
 51     printf("归并排序:\n");  
 52     MergeSort(0,n-1,arry,B);  
 53     Print(arry,n);  
 54     printf("希尔排序:\n");  
 55     ShellSort(arry,n);  
 56     Print(arry,n);  
 57     printf("堆排序:\n");  
 58     HeapSort(arry,n);  
 59     Print(arry,n);  
 60     return 0;  
 61 }  
 62   
 63   
 64   
 65 void Swap(int &a,int &b)  
 66 {  
 67     int temp=a;  
 68     a=b;  
 69     b=temp;  
 70 }  
 71   
 72 void Print(int *array,int n)  
 73 {  
 74       
 75     for(int i=0;i<n;i++)  
 76     {  
 77         printf("%d\t",array[i]);  
 78     }  
 79     printf("\n\n");  
 80 }  
 81   
 82 //冒泡排序的时间复杂度为n^2,稳定   
 83 void BubbleSort(int *array,int n)  
 84 {  
 85     for(int i=0;i<n;i++)  
 86     {  
 87         //for(int j=n-i;j>0;j--)  //这个是从最后一位开始进行冒泡排序,比较直观   
 88         for(int j=0;j<n-1-i;j++)  
 89         {  
 90             if(array[j]>array[j+1])  
 91             {  
 92                 Swap(array[j],array[j+1]);  
 93             }  
 94         }  
 95     }  
 96 }  
 97    
 98 //插入排序的实现   
 99 void InsertSort(int *array,int n)  
100 {  
101     for(int i=1;i<n;i++)  
102     {  
103         for(int j=i;j>0;j--)  
104         {  
105             if(array[j]<array[j-1])  
106             {  
107                 Swap(array[j],array[j-1]);  
108             }  
109         }  
110     }  
111 }  
112   
113   
114    
115 //基数排序的数组实现的过程  
116  /*参数的意义:三个数组为交换过程中的使用,标记位置过程的使用,原数组 
117  K为要进行排序的数组中数字的最大位数,r为进制*/   
118 void RadixSort(int *array,int n,int k,int r,int *cnt,int *B)  
119 {  
120     int j;  
121       
122     for(int i=0,rtoi=1;i<k;i++,rtoi*=r)  
123     {  
124         for(j=0;j<r;j++)  
125         {  
126             cnt[j]=0;  
127         }  
128         for(j=0;j<n;j++)  
129         {  
130             cnt[(array[j]/rtoi)%r]++;  
131         }  
132         for(j=1;j<r;j++)  
133         {  
134             cnt[j]=cnt[j]+cnt[j-1];  
135         }  
136         for(j=n-1;j>=0;j--)  
137         {  
138             //式子中所要表达的就是进行取余,从最低位开始进行   
139             B[--cnt[(array[j]/rtoi)%r]]=array[j];  
140         }  
141         for(j=0;j<n;j++)  
142         {  
143             array[j]=B[j];  
144         }  
145     }  
146 }  
147   
148   
149   
150 //快速排序实现,选择轴值在中间,但是在极端情况下,轴值在首位或者末尾均可  
151 //快速排序的优化有许多的方式,可以用堆栈代替递归,子数组在排序时长度的选择均可以进行优化   
152 void QuickSort(int Left,int Right,int *A)  
153 {  
154    if (Left >= Right)  
155     {  
156         return;  
157     }  
158     //将轴值放在数组的最后  
159     int pos = FindPos(Left, Right);  
160     Swap(pos, Right);  
161     // Left-1这个位置在数组的下界之前,目的是为了防止溢出  
162     int k = Parttion(Left - 1, Right, A[Right],A);  
163     Swap(k, Right);  
164     QuickSort(Left, k - 1,A);  
165     QuickSort(k + 1, Right,A);  
166 }  
167   
168   
169 int FindPos(int Left, int Right)  
170 {  
171     return (Left + Right) /2;  
172 }  
173   
174   
175 int Parttion(int Left, int Right, int& pos,int *A)  
176 {  
177     int i = Left;  
178     int j = Right;  
179     do  
180     {  
181         while ((pos>=A[Left])&&(Left<Right))  
182         {  
183             Left++;  
184         }  
185         //此处Left<Right保证了当轴值为子数组的最小值(即分隔出来以后左半部分的长度为0)不会越界  
186         while ((Left < Right) && (pos <=A[Right]))  
187         {  
188             Right--;  
189         }  
190         Swap(Left, Right);  
191     } while (Left < Right);  
192     return Left;  
193 }  
194   
195   
196   
197 //归并排序的实现:    
198 void MergeSort(int Left,int Right,int *array,int *B)  
199 {  
200     if(Left==Right)  
201     {  
202         return;  
203     }  
204     int mid=(Left+Right)/2;  
205     MergeSort(Left,mid,array,B);  
206     MergeSort(mid+1,Right,array,B);  
207     //复制到数组B中进行操作   
208     for(int i=Left;i<=Right;i++)  
209     {  
210         B[i]=array[i];  
211     }  
212       
213     int i=Left,j=mid+1;  
214     for(int k=Left;k<=Right;k++)  
215     {  
216         //左侧数组是否已经用完   
217         if(i==mid+1)  
218         {  
219             array[k]=B[j++];  
220         }  
221         //右侧数据是否用完   
222         else if(j>Right)  
223         {  
224             array[k]=B[i++];  
225         }  
226         //均未用完,则需要进行比较归位   
227         else if(B[i]<B[j])  
228         {  
229             array[k]=B[i++];  
230         }  
231         else  
232         {  
233             array[k]=B[j++];  
234         }  
235     }  
236 }  
237   
238   
239 //希尔排序的实现  
240 //希尔排序的最后一轮处理其实就是插入排序   
241 void ShellSort(int *array,int n)  
242 {  
243     for(int i=n/2;i>2;i/=2)  
244     {  
245         for(int j=0;j<i;j++)  
246         {  
247             IssSort(&array[j],n-j,i);  
248         }  
249         //最后一次处理为插入排序。所以增量为1   
250         IssSort(array,n,1);  
251     }  
252 }  
253   
254   
255   
256 void IssSort(int *array,int n,int temp)  
257 {  
258     for(int i=temp;i<n;i+=temp)  
259     {  
260         for(int j=i;(j>=temp)&&(array[j]<array[j-temp]);j-=temp)  
261         {  
262             Swap(array[j],array[j-temp]);  
263         }  
264     }  
265 }  
266   
267   
268   
269   
270 //堆排序的实现  
271 void HeapSort(int *array,int n)  
272 {  
273     for(int i=n/2-1;i>=0;--i)  
274     {  
275         HeapAdjust(array,i,n-1);  
276     }  
277     for(int i=n-1;i>0;--i)  
278     {  
279         Swap(array[0],array[i]);  
280         HeapAdjust(array,0,i-1);  
281     }  
282 }  
283   
284   
285   
286 void HeapAdjust(int *array,int low,int high)  
287 {  
288     int temp=array[low];  
289     for(int i=low*2+1;i<=high;i*=2)  
290     {  
291         if(i<high&&array[i]<=array[i+1])  
292         {  
293             ++i;  
294         }  
295         if(array[i]<=temp)  
296         {  
297             break;  
298         }  
299         array[low]=array[i];  
300         low=i;  
301     }  
302     array[low]=temp;  
303 }  

 

posted @ 2015-12-19 19:14  lenovo2014  阅读(246)  评论(0编辑  收藏  举报