以下两种排序算法均是采用分治策略实现
一、合并排序
其基本思想是:将要排序的元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。
具体求解过程分三步,第一步将要排序的集合分成两部分,第二步将分开的两部分用递归的思想继续分割,知道元素个数不大于1为止,第三步合并两个排好序的子集合。实现代码如下:
1. template<typename T>
2. void MergeSort(T a[], int left, int right)
3. {
4. if(left < right) {
5. int i = (left + right) / 2;
6. MergeSort(a, left, i);
7. MergeSort(a, i + 1, right);
8. Merge(a, b, left, i, right); //合并到数组b
9. Copy(a, b, left, right); //复制回数组a
10. }
11. }
两子集合合并过程为首先依次从每个子集合中选出一个数比较,较小的放入合并后的集合中,较大的放回原子集合,当一个子集合为空,另一个子集合还有元素时,直接将剩余的元素依次放入合并后的集合中即可。其实现代码为:
1. template<typename T>
2. void Merge(T c[], T d[], int l, int m, int r)
3. {
4. int i = l, j = m + 1, k = l;
5. while(i <= m) && (j <= r) {
6. if (c[i] <= c[j])
7. d[k++] = c[i++];
8. else
9. d[k++] = c[j++];
10. }
10. if(i > m) {
11. for(int q = j; q <= r; ++ q)
12. d[k++] = c[q];
13. } else {
14. for(int q = i; q <= m; ++q)
15. d[K++] = c[q];
16. }
17. }
二、快速排序
快速排序算法按以下三个步骤进行:
(1)分解:以 a[p] 为基准元素将 a[p:r] 划分成3段, a[