本文介绍分治算法在归并排序和逆序对计数中的应用。
归并排序
题目解析

该题目涉及数组排序,本文重点讲解归并排序这一分治算法。
算法原理

归并排序的基本思想是将数组不断划分,直到每个子数组仅包含一个元素,此时视为有序。随后递归返回,合并两个有序数组。合并操作可通过双指针高效完成。
归并排序对应树的后序遍历:先处理左右子树,再合并当前节点。

相比之下,快速排序对应前序遍历。

算法编写
class Solution {
public:
vector<int> tmp;
void MergeSort(vector<int>& nums, int left, int right) {
if(left >= right) return;
int mid = (right + left) >> 1;
MergeSort(nums, left, mid);
MergeSort(nums, mid + 1, right);
int cur1 = left, cur2 = mid + 1, i = 0;
(cur1 <= mid && cur2 <= right) tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
(cur1 <= mid) tmp[i++] = nums[cur1++];
(cur2 <= right) tmp[i++] = nums[cur2++];
( i = left; i <= right; i++) nums[i] = tmp[i - left];
}
{
tmp.(nums.());
(nums, , nums.() - );
nums;
}
};




