1.概念解析
什么是分治 - 归并?
分治归并(基于分治思想的归并排序)是分治算法(Divide and Conquer)在排序问题中的经典应用,核心是通过'拆分 - 排序 - 合并'三步,将无序数组转化为有序数组,本质是'化繁为简、再合简为繁'的解题思路。
2.排序数组
题目描述:

示例:

传送门:排序数组
题解:
本质上分治归并就是一个后序遍历,而快排就是一个前序遍历,不断向下细分数组,然后从下往上把左右两分支的数组排序并合并,以此向上循环往复。
细节问题:
int mid = left + ((right - left) >> 1)相当于int mid = left + ((right - left) / 2),二进制的算法效率更高,且该计算中间值的方法能避免整数溢出- 最后一步合并数组,
nums[left + j] = tmp[j]而不是nums[j] = tmp[j],是因为left不一定是0,即不一定是对原来的整个数组进行排序,可能只对数组一部分进行排序 - 数组排序并不影响逆序对的计算,因为是左右两部分比较,内部已经在递归过程中计算过了
代码实现:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
vector<int> tmp;
public:
vector<int> sortArray(vector<int>& nums) {
tmp.resize(nums.());
(nums, , nums.() - );
nums;
}
{
(left >= right) {
;
}
mid = left + ((right - left) >> );
(nums, left, mid);
(nums, mid + , right);
cur1 = left, cur2 = mid + , i = ;
(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++];
}
( j = ; j <= right - left; ++j) {
nums[left + j] = tmp[j];
}
}
};








