一、思想
divide - conquer:
- 把问题分解成两个或多个更小的问题
- 分别解决每个小问题
- 把各小问题的解答组合起来,即可得到原问题的解
二、 归并排序
Merge Sort:
- 利用分而治之方法进行排序算法
- 将n 个元素按非递增顺序排列
- 若n 为1,算法终止(base)
- 否则
将这一元素集合分割成两个或更多个子集合
对每一个子集合分别排序
将排好序的子集合并为一个集合
template<class T>
mergeSort( T *a, int left, int right)
{
//对a[left:right]中的元素进行排序
if (left < right) {
//至少两个元素
int middle = (left + right)/2; //中心位置
mergeSort(a, left, middle);
mergeSort(a, middle +1, right);
merge(a, b, left, middle, right); //从a合并到b
copy(b, a, left, right); //排序结果复制到a
}
}
分段:
template<class T>
void mergeSort(T a[], int n)
{
// 使用归并排序算法对a[0:n-1] 进行排序
T *b = new T [n];
int segmentSize = 1; // 段的大小
while (segmentSize < n) {
mergePass(a, b, segmentSize, n); // 从a归并到b
segmentSize += segmentSize;
mergePass(b, a, segmentSize, n); // 从b 归并到a
segmentSize += segmentSize;
}
}
template<class T>
void merge(T c[]