LL inverse(int *arr, int len)
{
if (len==1)return 0;
LL inverseLeft=inverse(arr, len/2);
LL inverseRight=inverse(arr+len/2, len-len/2);
if(inverseRight>=mod) inverseRight %= mod;
if(inverseLeft>=mod) inverseLeft %=mod;
int i=0, j=len/2, k=0,inverse=0;
while (i<len/2 && j < len)
{
if (arr[i] <= arr[j])
sorted[k++] = arr[i++];
else
{
sorted[k++] = arr[j++];
inverse += len/2 - i;
}
}
while(i<len/2) sorted[k++] = arr[i++];
while(j<len) sorted[k++] = arr[j++];
memcpy(arr,sorted,len*sizeof(int));
return inverse+inverseLeft+inverseRight;
}
二分归并排序,个人模板
归并排序求逆序
最新推荐文章于 2022-06-22 22:18:41 发布