分治之求逆序对数

好久不见. 提交于 2020-01-25 01:18:44

分治求逆序对数

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

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

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(nlog2n) O(n\log_2n)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!