在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
例如:数组{7,5,6,4},应该输出5。
#include <iostream>
#include <vector>
using namespace std;
long long InversePairsCore(vector<int>&, vector<int>&, int, int);
int InversePairs(vector<int> data) {
vector<int> copy;
for (int i = 0; i < data.size(); i++)
{
copy.push_back(data[i]);
}
long long count = InversePairsCore(data, copy, 0, data.size() - 1);
return count%1000000007;
}
long long InversePairsCore(vector<int> &data, vector<int> ©, int start, int end)
{
if (start == end)
{
copy[start] = data[end];
return 0;
}
int length = (end - start) / 2;
long long left = InversePairsCore(copy, data, start, start + length);//这一行和下一行要注意的是函数中copy和data换了位置,
long long right = InversePairsCore(copy, data, start + length + 1, end);//所以在InversePairsCore函数最后就不需要将copy中的已经排好序的数据再复制到data中
int p1 = start + length, p2 = end, p3 = end;
long long count = 0;
while (p1>=start&&p2>=start+length+1)
{
if (data[p1] > data[p2])
{
count += p2 - start - length;
copy[p3--] = data[p1--];
}
else {
copy[p3--] = data[p2--];
}
}
while (p1>=start)
{
copy[p3--] = data[p1];
}
while (p2>=start+length+1)
{
copy[p3--] = data[p2];
}
return left + right + count;
}
int main()
{
vector<int> v = { 7,5,6,4 };
int count = InversePairs(v);
cout << count << endl;
return 0;
}