1 typedef int datatype;
2
3 inline void swap(datatype &a, datatype &b)
4 {
5 datatype tmp = a;
6 a = b;
7 b = tmp;
8 }
9
10 /***********************************
11 冒泡排序:
12 每次将最小的数"冒"在最前面
13 ***********************************/
14 void BubbleSort(datatype Array[], int length)
15 {
16 for (int i = 0; i < length; i++)
17 {
18 for (int j = i+1; j < length; j++)
19 {
20 if (Array[j] < Array[i])
21 {
22 swap(Array[i], Array[j]);
23 }
24 }
25 }
26 }
27
28 /***********************************
29 插入排序
30 从后往前依次插入元素
31 ***********************************/
32 void InsertSort(datatype Array[], int length)
33 {
34
35 for(int j = 1; j != length; j++)
36 {
37 datatype key = Array[j];
38 int i = j - 1;
39 while(i != -1 && Array[i] > key)
40 {
41 Array[i+1]= Array[i];
42 i--;
43 }
44
45 Array[i+1] = key;
46 }
47
48 }
49
50 /***********************************
51 归并排序
52 分别对左右两边进行排序,然后合并,需要申请新的空间
53 ***********************************/
54 static void Merge(datatype SortArray[], int start, int middle, int end)
55 {
56 int LeftLength = middle - start + 1;
57 int RightLength = end - middle;
58
59 // 创建临时数组保存已排序好的左右数组
60 datatype *LeftArray = (datatype *)malloc(LeftLength * sizeof(datatype));
61 for(int i = 0; i != LeftLength; ++i)
62 LeftArray[i] = SortArray[start + i];
63 datatype *RightArray = (datatype *)malloc(RightLength * sizeof(datatype));
64 for(int i = 0; i != RightLength; ++i)
65 RightArray[i] = SortArray[middle + i + 1];
66
67 // 归并
68 int i = 0;
69 int j = 0;
70 int k = start;
71 while(i != LeftLength && j != RightLength)
72 {
73 if(LeftArray[i] <= RightArray[j])
74 SortArray[k++] = LeftArray[i++];
75 else
76 SortArray[k++] = RightArray[j++];
77 }
78
79 while(i != LeftLength)
80 {
81 SortArray[k++] = LeftArray[i++];
82 }
83
84 while(j != RightLength)
85 {
86 SortArray[k++] = RightArray[j++];
87 }
88
89 free(LeftArray);
90 free(RightArray);
91 }
92
93 static void _MergeSort(datatype Array[], int start, int end)
94 {
95 if (start < end)
96 {
97 int middle = (start + end)/2;
98 _MergeSort(Array, start, middle);
99 _MergeSort(Array, middle+1, end);
100 Merge(Array, start, middle, end);
101 }
102 }
103
104 void MergeSort(datatype Array[], int length)
105 {
106 _MergeSort(Array, 0, length -1);
107 }
108
109 /***********************************
110 快速排序算法,和归并排序相比,快速排序不需要额外的空间
111 ***********************************/
112 // 将数组划分为2组,左边的都比中间元素小,右边的都比中间元素大
113 static int Partition(datatype SortArray[], int start, int end)
114 {
115 datatype middleValue = SortArray[end];
116 int middleIndex = start - 1;
117
118 for(int j = start; j != end; ++j)
119 {
120 if (SortArray[j] <= middleValue)
121 {
122 middleIndex++;
123 swap(SortArray[middleIndex], SortArray[j]);
124 }
125
126 }
127 swap(SortArray[middleIndex+1], SortArray[end]);
128
129 return middleIndex+1;
130 }
131
132 static void _QuickSort(datatype SortArray[], int start, int end)
133 {
134 if(start < end)
135 {
136 int middle = Partition(SortArray, start, end);
137 _QuickSort(SortArray, start, middle-1);
138 _QuickSort(SortArray, middle+1, end);
139 }
140 }
141
142 void QuickSort(datatype SortArray[], int length)
143 {
144 _QuickSort(SortArray, 0, length-1);
145 }
146
147 /***********************************
148 计数排序
149 计数排序的基本思想是对每一个输入元素x,确定
150 出不小于x的元素个数。
151 只适用于正整数
152 ***********************************/
153 static void _CountingSort(datatype SortArray[], datatype SortedArray[], int ArrayLength,datatype maxValue)
154 {
155 datatype *CountArray = (datatype *)malloc((maxValue+1) * sizeof(datatype));
156 assert(NULL != CountArray);
157
158 // 初始化
159 for(int i = 0; i != maxValue+1; ++i)
160 CountArray[i] = 0;
161
162 // 计数
163 for(int i = 0; i != ArrayLength; ++i)
164 CountArray[(SortArray[i])] += 1; // 等于的元素个数
165
166 /*
167 若不考虑稳定性,可以使用以下代码,此时实际不需要SortedArray数组
168 int index = 0;
169 for (datatype i = 0; i <= maxValue; i++)
170 {
171 for (int j = 0; j < CountArray[i]; j++)
172 {
173 SortedArray[inddex++] = i;
174 }
175 }
176
177 */
178
179 // 重排
180 /*
181 从大到小,可保持稳定性,即具有相同值的元素
182 在输出数组中的相对次序与他们在输入数组中的次序相同
183 */
184 for(int i = 1; i != maxValue+1; ++i)
185 CountArray[i] += CountArray[i-1]; // 小于或等于的个数
186
187 for(int i = ArrayLength-1; i != -1; --i)
188 {
189 // CountArray[SortArray[i]]:小于或等于SortArray[i]的个数,再-1即为排序后在数组中的位置
190 SortedArray[(CountArray[(SortArray[i])]) - 1] = SortArray[i];
191 CountArray[(SortArray[i])] -= 1;
192
193 }
194
195 free(CountArray);
196 }
197
198 void CountingSort(datatype SortArray[], int length)
199 {
200 datatype maxValue = 0;
201 for (int i = 0; i < length; i++)
202 {
203 maxValue = maxValue > SortArray[i] ? maxValue : SortArray[i];
204 }
205
206 datatype *SortedArray = (datatype *)malloc(length * sizeof(datatype));
207 assert(NULL !=SortedArray);
208
209 _CountingSort(SortArray, SortedArray, length, maxValue);
210
211 for (int i = 0; i < length; i++)
212 {
213 SortArray[i] = SortedArray[i];
214 }
215
216 free(SortedArray);
217
218 }
219
220 /***********************************
221 基数排序
222 利用计数排序算法,对数组从低向高位排序
223 ***********************************/
224 static void CountingSortForRadixSort(datatype SortArray[], datatype CmpArray[], int ArrayLength, int maxValue)
225 {
226 datatype *CountArray = (datatype *)malloc((maxValue+1) * sizeof(datatype));
227 datatype *SortedArray = (datatype *)malloc(ArrayLength * sizeof(datatype));
228 assert(NULL != CountArray || NULL != SortedArray);
229
230 for(int i = 0; i != maxValue+1; ++i)
231 CountArray[i] = 0;
232
233 for(int i = 0; i != ArrayLength; ++i)
234 CountArray[(CmpArray[i])]++;
235 for(int i = 1; i != maxValue+1; ++i)
236 CountArray[i] += CountArray[i-1];
237
238 for(int i = ArrayLength-1; i != -1; --i)
239 {
240 SortedArray[(CountArray[CmpArray[i]])-1]= SortArray[i];
241 CountArray[CmpArray[i]] -= 1;
242 }
243
244 for(int i = 0; i != ArrayLength; ++i)
245 SortArray[i] = SortedArray[i];
246
247 free(CountArray);
248 free(SortedArray);
249
250 }
251
252 void RadixSort(datatype SortArray[], int ArrayLength)
253 {
254 datatype *RadixArray = (datatype *)malloc(ArrayLength * sizeof(datatype));
255 assert(NULL != RadixArray);
256
257 datatype BaseNumber = 1;
258 bool rsIsOk = false;
259
260 while(false ==rsIsOk)
261 {
262 rsIsOk = true;
263 BaseNumber *= 10;
264
265 for(int i = 0; i != ArrayLength; ++i)
266 {
267 RadixArray[i] = SortArray[i] % BaseNumber;
268 RadixArray[i] = RadixArray[i] / (BaseNumber / 10);
269 if(RadixArray[i] > 0)
270 rsIsOk = false;
271 }
272 if(true == rsIsOk)
273 break;
274 CountingSortForRadixSort(SortArray, RadixArray, ArrayLength, 9);
275 }
276
277 free(RadixArray);
278 }
279 /***********************************
280 堆排序算法
281 堆: 可以视为一棵完全二叉树,树的每一层都是填满的,除了最后一层
282 其任何一非叶节点满足性质:
283 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
284
285 堆排序算法主要用于优先级队列
286 ***********************************/
287 #define PARENT(x) ((x) >> 1) // 节点x的父节点下标号
288 #define LEFT(x) ((x) << 1) // 节点x的左子节点下标号
289 #define RIGHT(x) (((x) << 1) + 1) // 节点x的右子节点下标号
290
291 static void MaxHeapify(int SortArray[], int heap_size, int parent)
292 {
293 int left, right, largest;
294
295 left = LEFT(parent+1) - 1;
296 right = RIGHT(parent+1) -1;
297
298 if(left < heap_size && SortArray[left] > SortArray[parent])
299 largest = left;
300 else
301 largest = parent;
302
303 if(right < heap_size && SortArray[right] > SortArray[largest])
304 largest = right;
305
306 if(largest != parent)
307 {
308 swap(SortArray[largest], SortArray[parent]);
309
310 MaxHeapify(SortArray, heap_size, largest);
311 }
312 }
313
314 static void BuildMaxHeap(int SortArray[], int ArrayLength)
315 {
316 int HeapSize = ArrayLength;
317
318 for(int i = ArrayLength/2; i != -1; --i)
319 MaxHeapify(SortArray,HeapSize,i);
320 }
321
322 void HeapSort(int SortArray[], int ArrayLength)
323 {
324 int HeapSize = ArrayLength;
325
326 BuildMaxHeap(SortArray, ArrayLength);
327 for(int i = ArrayLength-1; i !=0; --i)
328 {
329 swap(SortArray[0], SortArray[i]);
330 HeapSize--;
331 MaxHeapify(SortArray, HeapSize, 0);
332 }
333 }