数组中的逆序对_牛客题霸_牛客网 (nowcoder.com)
归并排序
先分:分呢,就是将数组分为两个子数组,两个子数组分为四个子数组,依次向下分,直到数组不能再分为止!
后并:并呢,就是从最小的数组按照顺序合并,从小到大或从大到小,依次向上合并,最后得到合并完的顺序数组!
#include <vector>
class Solution {
public:
int mod = 1000000007;
int mergeSort(int left, int right, vector<int>& data, vector<int>& temp) {
//停止划分
if (left >= right) return 0;
//取中间
int mid = (left + right) / 2;
//左右划分合并
int res = mergeSort(left, mid, data, temp) + mergeSort(mid + 1, right, data,
temp);
//防止溢出
res %= mod;
//双指针 分别指向两部分开头
int i = left, j = mid + 1;
//拷贝到temp中
for (int k = left; k <= right; k++) {
temp[k] = data[k];
}
for (int k = left; k <= right; k++) {
//左边的走完了
if (i == mid + 1) {
data[k] = temp[j++];
}
//右边的走完了 或者 左边的小
else if (j == right + 1 || temp[i] <= temp[j]) {
data[k] = temp[i++];
}//左边比右边大,答案增加
else{
data[k] = temp[j++];
res += mid-i+1;
}
}
return res%mod;
}
int InversePairs(vector<int> data) {
int n = data.size();
vector<int> res(n);
return mergeSort(0, n - 1, data, res);
}
};