5

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

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)
4

2 回答 2

9

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

于 2013-10-29T08:14:36.840 回答
0

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

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

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

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

于 2021-04-18T12:57:15.617 回答