分治之求逆序对数

分治求逆序对数

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

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

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)

发布了28 篇原创文章 · 获赞 1 · 访问量 615

猜你喜欢

转载自blog.csdn.net/qq_44384577/article/details/103866332