【问题标题】:Is it possible to calculate the number of count inversions using quicksort?是否可以使用快速排序计算计数反转的数量?
【发布时间】:2013-11-08 06:51:14
【问题描述】:

我已经使用mergesort解决了这个问题,现在我在想是否可以使用quicksort来计算数字?我也编码了快速排序,但我不知道如何计算。这是我的代码:

def Merge_and_Count(AL, AR):
    count=0
    i = 0
    j = 0
    A = []
    for index in range(0, len(AL) + len(AR)):        
        if i<len(AL) and j<len(AR):
            if AL[i] > AR[j]:
                A.append(AR[j])
                j = j + 1
                count = count+len(AL) - i
            else:
                A.append(AL[i])
                i = i + 1
        elif i<len(AL):
            A.append(AL[i])
            i=i+1
        elif j<len(AR):
            A.append(AR[j])
            j=j+1
    return(count,A)

def Sort_and_Count(Arrays):
        if len(Arrays)==1:
            return (0,Arrays)
        list1=Arrays[:len(Arrays) // 2]
        list2=Arrays[len(Arrays) // 2:]
        (LN,list1) = Sort_and_Count(list1)
        (RN,list2) = Sort_and_Count(list2)
        (M,Arrays)= Merge_and_Count(list1,list2)
        return (LN + RN + M,Arrays)

【问题讨论】:

    标签: python algorithm quicksort mergesort


    【解决方案1】:

    通常不会,因为在分区过程中,当您将一个值移动到轴心的正确一侧时,您不知道您将其移过的值有多少小于它,有多少大于它。因此,一旦您这样做了,您就会丢失有关原始输入中反转次数的信息。

    【讨论】:

    • 是否可以计算过去多少?或者复杂度约为 O(n^2)?
    • 好吧,Quicksort 一开始是O(n log n),最坏的情况是O(n^2)。所以是的,在每个分区步骤中添加Theta(n^2) 操作会使复杂性变得更糟,而不仅仅是忘记排序并通过检查输入中的每对元素来天真地计算反转。
    • 我想如果你能想出一个特例,你就会知道为什么不能。例如,假设我们设置了{3, 2, 1} 并使用最后一个作为枢轴。实际上数字2 失去了它的反转,因为在一次迭代之后数组将是{1, 2, 3}
    【解决方案2】:

    这个问题我遇到过几次,总体来说我觉得用快速排序来计算倒数应该还是可以的,只要我们对原来的快速排序算法做一些修改。 (但我还没有验证,抱歉)。

    考虑一个数组3, 6, 2, 5, 4, 1。支持我们使用3作为支点,投票最多的答案是正确的,因为交易所可能会弄乱其他号码的顺序。但是,我们可以通过引入一个新的临时数组来做不同的事情:

    1. 第一次遍历数组。在迭代过程中,将所有小于3 的数字移动到临时数组中。对于每个这样的数字,我们还记录了它之前有多少比3 大的数字。在这种情况下,号码2前面有一个号码6,号码1前面有3个号码6, 5, 4。这可以通过简单的计数来完成。
    2. 然后我们将3复制到临时数组中。
    3. 然后我们再次迭代数组并将大于 3 的数字移动到临时数组中。最后我们得到2 1 3 6 5 4

    问题是在这个过程中有多少反转对丢失了?该数字是第一步中所有数字的总和,以及第二步中小于枢轴的数字的计数。然后我们计算了所有的反转数,一个是>=pivot,另一个是

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 2013-04-26
      • 1970-01-01
      相关资源
      最近更新 更多