我已经使用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)
答案 0 :(得分:5)
通常不会,因为在分区过程中,当您将某个值移动到数据透视的正确一侧时,您不知道它移动过去的值有多少小于它,有多少值更大。因此,只要您这样做,就会丢失有关原始输入中的反转次数的信息。
答案 1 :(得分:0)
这个问题我也遇到过一段时间了,总的来说,我觉得用quick sort来计算倒数应该还是可以的,只要我们对原来的quick sort算法做一些修改就可以了。 (但我还没有验证,抱歉)。
考虑一个数组 3, 6, 2, 5, 4, 1
。支持我们使用 3
作为枢轴,投票最多的答案是正确的,因为交易所可能会弄乱其他数字的顺序。但是,我们可能会通过引入一个新的临时数组来做不同的事情:
3
的数字移动到临时数组中。对于每个这样的数字,我们还记录了它之前有多少比 3
大的数字。在这种情况下,数字 2
前面有一个数字 6
,数字 1
前面有 3 个数字 6, 5, 4
。这可以通过简单的计数来完成。3
复制到临时数组中。2 1 3 6 5 4
。问题是在这个过程中丢失了多少反转对?数字是第一步中所有数字的总和,以及第二步中小于枢轴的数字的计数。然后我们计算了所有的倒数,一个是>=pivot,另一个是