归并排序的实现过程:
(1)把长度为n的输入序列分成两个长度为 n/2 的子序列;
(2)对这两个子序列分别采用归并排序(递归);
(3)将两个排序好的子序列合并成一个最终的排序序列。
归并和快排具有相似性,但步骤顺序相反。
归并:先排序左右子序列,然后合并两个有序子数组;
快排:先调配出左右子数组,然后对于左右子数组记性排序(分治)。
实现代码:
class Solution {
public:
void mergeSort(vector<int>& nums, int begin, int end) {
if(begin >= end) return ; //terminator
int mid = (begin + end) / 2;
mergeSort(nums, begin, mid); //drill down
mergeSort(nums, mid + 1, end);
mergeArray(nums, begin, mid, end);
}
void mergeArray(vector<int>& nums, int begin, int mid, int end) {
vector<int> tmp(end - begin + 1, 0);
int i = begin, m = mid; //第一部分
int j = mid + 1, n = end; //第二部分
int k = 0;
while(i <= m && j <= n)
tmp[k++] = nums[i] < nums[j] ? nums[i++] : nums[j++];
while(i <= m)
tmp[k++] = nums[i++];
while(j <= n)
tmp[k++] = nums[j++];
for(int i = 0; i < k; ++i)
nums[begin + i] = tmp[i];
}
};