逆序对
luckydrawbox · · 个人记录
归并排序是求逆序对的常用办法,故这里也使用归并排序。
宏定义
请根据需要更改排序基本类型
#define NXD_T long long
上面是以
变量
r[i]:辅助变量,因此空间复杂度为
函数
nxd_compare(NXD_T x,NXD_T y):比较的函数,返回值是 x<y,就是从小到大排序。
nxd(NXD_T *a,int s,int t):对于 x<y 的情况,求的是
#define NXD_T long long
NXD_T r[N];
bool nxd_compare(NXD_T x,NXD_T y){
return x<y;
}
long long nxd(NXD_T *a,int s,int t){
if(s==t)
return 0;
int mid=(s+t)/2;
int i=s,j=mid+1,k=s;
long long ans=nxd(a,s,mid)+nxd(a,mid+1,t);
while(i<=mid&&j<=t)
if(a[i]<=a[j]){
r[k++]=a[i++];
ans+=j-mid-1;
}
else
r[k++]=a[j++];
while(i<=mid){
r[k++]=a[i++];
ans+=j-mid-1;
}
while(j<=t)
r[k++]=a[j++];
for(int i=s;i<=t;i++)
a[i]=r[i];
return ans;
}