归并排序
(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
- 分治法
可以通俗的解释为:把一片领土分解,分解为若干块小部分,然后一块块地占领征服,被分解的可以是不同的政治派别或是其他什么,然后让他们彼此异化。
分治法的精髓:
分–将问题分解为规模更小的子问题;
治–将这些规模更小的子问题逐个击破;
合–将已解决的子问题合并,最终得出“母”问题的解;
归并排序
我们经过看这个过程图来了解归并排序。
- 首先,是进行归并的“分”,即__mergeSort(T arr[], int l, int r),将整个数组分成左右两部分。
int mid = (l + r) / 2; //arr[l...r]
再将左右两部分分别分成左右两部分,直到分成单个元素。
- 第二步,是进行归并的“并”,即__merge(T arr[], int l, int mid, int r),递归的进行一步步向上的左右两部分的排序,也就是将arr[l…mid]和arr[mid+1…r]两部分进行归并。
在这里要开辟一个辅助空间,即
T *aux = new T[r - l + 1];
将每次的两部分排序过程在aux空间中进行。
C++完整代码如下:
//归并排序
// 将arr[l...mid]和arr[mid+1...r]两部分进行归并