是否可以使用quicksort计算计数反转次数?

时间:2013-10-29 08:05:47

标签: python algorithm quicksort mergesort

我已经使用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)

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

这个问题我也遇到过一段时间了,总的来说,我觉得用quick sort来计算倒数应该还是可以的,只要我们对原来的quick sort算法做一些修改就可以了。 (但我还没有验证,抱歉)。

考虑一个数组 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,另一个是