只需要修改归并排序
#include <cstdlib>
#include <iostream>
#include <vector>
#define INFINITE 1000
using namespace std;
int count=0;
void input(vector<int>& v)
{
cout<<"please enter the number(<1000):"<<endl;
int data;
while(cin>>data)
v.push_back(data);
}
void merge(vector<int> &v,int p,int q,int r)
{
vector<int>v1,v2;
int m=0;
int n=0;
for(int i=p; i<=q; i++)
v1.push_back(v.at(i));
v1.push_back(INFINITE);
for(int i=q+1; i<=r; i++)
v2.push_back(v.at(i));
v2.push_back(INFINITE);
for(int i=p; i<=r; i++)
{
if(v1[m]<=v2[n])
{
v[i]=v1[m];
m++;
}
else
{
v[i]=v2[n];
n++;
count += (q-p+1-m);
//计数,因为v1、v2都是已经排序的,
//所以一旦出现v1[m]>v2[n],v1中
//剩余的元素也均大于v2[n],这样共有
//q-p+1-m个逆序对
}
}
}
void mergeSort(vector<int>& v, int p, int r)
{
if(p<r)
{
int q=(p+r)/2;
mergeSort(v,p,q);
mergeSort(v,q+1,r);
merge(v,p,q,r);
}
}
int main()
{
vector<int>v;
input(v);
mergeSort(v,0,v.size()-1);
cout<<count<<endl;
system("PAUSE");
return 0;
}