归并排序的演进
#include <iostream>
using namespace std;
//src is seperatly sorted [start,flag] and [flag+1,end]
//merge 2 parts into 1 sorted array res
int Merge(int* src,int* res,int start,int end,int flag){
int i=flag,j=end,k=end;
int between=0;
while(i>=start && j>=flag+1){
if(src[i]>src[j]){
res[k--]=src[i--];
between+=j-flag;
}
else res[k--]=src[j--];
}
if(i>=start){
while(i>=start) res[k--]=src[i--];
}
if(j>=flag+1){
while(j>=flag+1) res[k--]=src[j--];
}
return between;
}
//get [start,end] sorted
int InversePairCore(int* src,int* res,int len,int start,int end){
if(start==end){
res[start]=src[start];
return 0;
}
int tmpres[len];
int flag=(start+end)/2;
//get [start,flag] sorted
int left=InversePairCore(src,tmpres,len,start,flag);
//get [flag+1,end] sorted
int right=InversePairCore(src,tmpres,len,flag+1,end);
//merge 2 parts, to get [start,end] sorted
int between=Merge(tmpres,res,start,end,flag);
return left+right+between;
}
int InversePair(int* src,int* res,int len){
if(!src||!res||len<=0) return 0;
return InversePairCore(src,res,len,0,len-1);
}
int main(){
int src[]={3,4,6,5,1,2};
int len=sizeof(src)/sizeof(*src);
int res[len];
//MergeSort(src,res,len);
cout<<InversePair(src,res,len)<<'\n';
/*for(int i=0;i<len;++i){
cout<<res[i]<<' ';
}*/
}