逆序对

本文介绍了两种高效计算逆序对的方法:归并排序和树状数组。通过对比这两种方法的时间复杂度、空间复杂度及代码长度,帮助读者选择最适合实际需求的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天想写一个专题:如何求一串数中的逆序对个数。

具体来讲,一共有两种比较好的方法:
1. 归并排序
2. 树状数组

两种方法的比较

先来比较一下两个方法:

方 法时间复杂度空间复杂度代码长度理解难度
归并排序 O(nlog2n) O(n) 相比较长(除非你用STL)容易
树状数组 O(nlog2n) O(n) 短小精悍(用不到STL)一般

  
  好吧,其实并没有多大区别,但是还是建议这两个方法都学一下

归并排序

其实就是在归并排序的时候发现一个较大的数在前面,计算一个逆序对个数,废话不多说,直接看代码理解吧。

代码

void Msort(int l,int r)
{
    int ret[500002];
    if(l!=r)
    {
        int mid=(l+r)/2;
        Msort(l,mid);Msort(mid+1,r);
        int i=l,j=mid+1,k=l;
        while(i<=mid&&j<=r)
        {
            if(a[i].num<=a[j].num)
            {
                ret[k]=a[i].num;
                i++;k++;
            }else
            {
                ret[k]=a[j].num;
                j++;k++;ans=(ans+mid-i+1)%P;//加上逆序对个数(模P)
            };
        };
        while(i<=mid)
        {
            ret[k]=a[i].num;
            i++;k++;
        };
        while(j<=r)
        {
            ret[k]=a[j].num;
            j++;k++;
        };
        for(int i=l;i<=r;i++)a[i].num=ret[i];
    };
};

树状数组

详细解释请看我的另一篇博文《树状数组》,具体原理与代码就不写了。(偷一下懒)

相关链接

另一篇博文《树状数组》

到这里就结束了。感谢惠读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值