写了个模板类,指针 a为被排序,b为tmp 返回逆序数,调用时候Merge.sort(a,b,n);
#define ll long long template<class T> class Merge { public: T *a,*b; int n; ll num; ll sort(T *a1,T *b1,int n1){ a=a1;b=b1;n=n1; num=0; divide(0,n-1); return num; } void divide(int l,int r){ if(r>l){ int mid=(l+r)>>1; divide(l,mid); divide(mid+1,r); merge(l,r); } } void merge(int l,int r){ int mid=(l+r)>>1; int lpoint=l,rpoint=mid+1; int point=l; while(lpoint<=mid&&rpoint<=r){ if(a[rpoint]<a[lpoint]){ b[point++]=a[rpoint++]; num+=(mid-lpoint+1); } else{ b[point++]=a[lpoint++]; } } while(lpoint<=mid){ b[point++]=a[lpoint++]; } while(rpoint<=r){ b[point++]=a[rpoint++]; } for(int i=l;i<=r;i++){ a[i]=b[i]; } } };