1、最简单的方法是暴力,对于每一个数都依次和后面的进行比较。
#include <iostream>
#include <vector>
using namespace std;
int InverseParis(vector<int> &data)
{
size_t num = data.size();
int count = 0;
for (size_t i = 0; i < num; ++i)
{
for (size_t j = i+1; j < num; ++j)
{
if(data[i] > data[j])
count++;
}
}
return count;
}
int main()
{
int a[4]={7,5,6,4};
vector<int> data(a,a+4);
cout<<InverseParis(data)<<endl;
return 0;
}
2、利用归并排序的思想,边归并排序,边统计。例如(5,7) (4,6)从后往前,判断出7大于6,则后一个数组里面全部都可以和7组成逆序对,然后判断5,直到4小于5,则4和4前面的都可以和5构成逆序对。
#include <iostream>
#include <vector>
using namespace std;
int InverseParisRes(vector<int> &data,vector<int> ©,int start,int end);
int InverseParis(vector<int> &data)
{
size_t num = data.size();
int count = 0;
vector<int> copy(num,0);
for (size_t i = 0; i < num; ++i)
copy[i] = data[i];
count = InverseParisRes(data,copy,0,num-1);
return count;
}
int InverseParisRes(vector<int> &data,vector<int> ©,int start,int end)
{
if(start == end)
{
copy[start] = data[start];
return 0;
}
int middle = (end - start)/2;
int left = InverseParisRes(copy,data,start,start+middle);
int right = InverseParisRes(copy,data,start+middle+1,end);
int i = start + middle;
int j = end,k = end;
int count = 0;
while (i >= start && j >= start+middle+1)
{
if(data[i] > data[j])
{
copy[k--] = data[i--];
count += j-start-middle;
}
else
{
copy[k--] = data[j--];
}
}
while (i >= start)
copy[k--] = data[i--];
while (j >= start+middle+1)
copy[k--] = data[j--];
return left + right + count;
}
int main()
{
int a[4]={7,5,6,4};
vector<int> data(a,a+4);
cout<<InverseParis(data)<<endl;
return 0;
}