分治之求逆序对数

12 篇文章 0 订阅
4 篇文章 0 订阅
分治求逆序对数
用分治求逆序对数,其思想与归并排序差不多,具体的我们可以看一下伪代码

第一步还是把一个大的数组进行分割,直至不能再分为止,这样的话总的逆序对数就可以分为三部分,左边数组的逆序对数、右边数组的逆序对数、左右数组交叉形成的逆序数对数。所以最后的结果是把他们三个加起来。第一步的伪代码:

Count_Sort(A)
    Divide A into two sub_array L and R
    Lc=Count_Sort(L)
    Rc=Count_Sort(R)
    LR=Merge_Count(L,R)
    return Lc+Rc+LR

第二部就是比较复杂的一步,类比归并排序,也是两个指针分别从左右两个数组中取元素进行比较,但是比暴力计算逆序对数去掉了很多冗余,因为左右数组都排好序的情况下,如果左边数组的一个元素a比右边数组的一个元素b大的话,那么在左边数组中,a后边的所有元素都要比b大,所以a后面的元素就不用和b再进行比较了。伪代码:

Merge_Count(L,R)
    num=0,i=0,j=0
    for k=0 to ||L||+||R||-1 do
        if L[i]>R[j]
            A[k]=R[j]
            j++
            num+=(||L||-i)
        else
            A[k]=L[i]
            i++
        end if
    end for
    return num

该算法的时间复杂度为 O ( n log ⁡ 2 n ) O(n\log_2n) O(nlog2n)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值