我是靠谱客的博主 生动猫咪,最近开发中收集的这篇文章主要介绍分治之求逆序对数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

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(nlog_2n) O(nlog2n)

最后

以上就是生动猫咪为你收集整理的分治之求逆序对数的全部内容,希望文章能够帮你解决分治之求逆序对数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部