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 }