目标:
归并排序使用的就是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。从我刚才的描述,你有没有感觉到,分治思想跟我们前面讲的递归思想很像。是的,分治算法一般都是用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧,这两者并不冲突。
数组中的逆序对:

步骤:
class Solution {
private:
const int mod = 1000000007;
public:
void merge(vector<int> &data, vector<int> &tmp, int left, int right, int &ret) {
if (left >= right)
return;
int mid = (left + right) / 2;
merge(data, tmp, left, mid, ret);
merge(data, tmp, mid + 1, right, ret);
merge2(data, tmp, left, mid, right, ret);
}
void merge2(vector<int> &data, vector<int> &tmp, int left, int mid, int right, int &ret) {
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (data[i] > data[j]) {
tmp[k++] = data[j++];
ret += (mid - i + 1);
ret %= mod;
} else {
tmp[k++] = data[i++];
}
}
while (i <= mid) {
tmp[k++] = data[i++];
}
while (j <= right) {
tmp[k++] = data[j++];
}
for (k = 0, i = left; i <= right; ++i, ++k) {
data[i] = tmp[k];
}
}
int InversePairs(vector<int> data) {
int ret = 0;
vector<int> tmp(data.size());
merge(data, tmp, 0, data.size() - 1, ret);
return ret;
}
};