关于逆序对的问题(分治归并解法)
#include<iostream>
using namespace std;
int Merge(int r[],int s,int m,int t)
{
int r1[t+1];
for(int i=0;i<t+1;i++)
r1[i]=r[i];
int i=s,j=m+1,k=s;
int sum=0;
while(i<=m&&j<=t)
{
if(r1[i]<=r1[j]) r[k++]=r1[i++];
else{
sum+=m-i+1;
r[k++]=r1[j++];
}
}
while(i<=m) r[k++]=r1[i++];
while(j<=t) r[k++]=r1[j++];
return sum;
}
int MergeSort(int r[],int s,int t)
{
int m,s1,s2,s3,sum=0;
if(s==t) return sum;
else{
m=(s+t)/2;
s1=MergeSort(r,s,m);
s2=MergeSort(r,m+1,t);
s3=Merge(r,s,m,t);
}
sum=s1+s2+s3;
return sum;
}
int main()
{
int r[]={5,4,3,8,7,6,4,2,9,0,4,1};
int s=0,t=sizeof(r)/sizeof(r[0])-1;
cout<<MergeSort(r,s,t)<<endl;
for(int i=0;i<sizeof(r)/sizeof(r[0]);i++){
if(i!=0) cout<<" ";
cout<<r[i];
}
cout<<endl;
return 0;
}