#include <iostream>
#include <vector>
using namespace std;
//思路分析,一组数据逆序对的个数,在归并过程中,
//不断的通过比较的方式合并两个排序数组,在这个操作中,如果遇到左子数组当前元素>右子数组当前元素,
//意味着「左子数组当前元素至末尾元素」与「右子数组当前元素」构成了若干「逆序对」。
void mergeSort(vector<int>& dataVec, int left, int right, int& count)
{
//分割区间到不可分割的临界条件,此时每个区间只有一个元素,天然有序
if (left >= right)
{
return;
}
//分割过程
int mid = (left + right) / 2;
int partition1Left = left;
int partition1Right = mid;
int partition2Left = mid + 1;
int partition2Right = right;
//不断分割
mergeSort(dataVec, partition1Left, partition1Right,count);
mergeSort(dataVec, partition2Left, partition2Right,count);
//分割到临界点后开始对有序数组以分割顺序相反的顺序进行合并
vector<int> resultVec;//记录每一轮归并有序数的结果,然后给dataVec对应区间赋值,使得该区间有序
int partition1LeftBak = partition1Left;//用于最后放置有序数组的起始位置的记录
while (partition1Left <= partition1Right && partition2Left <= partition2Right)
{
if (dataVec[partition1Left] < dataVec[partition2Left])
{
resultVec.push_back(dataVec[partition1Left]);
partition1Left++;
}
else
{
resultVec.push_back(dataVec[partition2Left]);
partition2Left++;
count += (partition1Right - partition1Left + 1);//count 变化的地方
}
}
while (partition1Left <= partition1Right)
{
resultVec.push_back(dataVec[partition1Left]);
partition1Left++;
}
while (partition2Left <= partition2Right)
{
resultVec.push_back(dataVec[partition2Left]);
partition2Left++;
}
for (int i = 0; i < (int)resultVec.size(); i++)
{
dataVec[partition1LeftBak] = resultVec[i];
partition1LeftBak++;
}
}
int getReversePairsNum(vector<int>& dataVec)
{
int count = 0;
mergeSort(dataVec, 0, dataVec.size() - 1, count);
return count;
}
int main()
{
vector<int> dataVec{ 7, 5, 6, 4 };
int count = getReversePairsNum(dataVec);
for (int i = 0; i < (int)dataVec.size(); i++)
{
cout << dataVec[i] << " ";
}
cout << endl;
cout << count << endl;
}