【发布时间】:2017-02-19 15:51:34
【问题描述】:
我已经实现了合并排序,除了排序之外,我还希望它计算原始数组中inversions 的数量。
下面是我实现它的尝试,由于某种原因,它不能正确计算反转的数量。
例如,mergeSort([4, 3, 2, 1]) 应该返回 (6, [1, 2, 3, 4])。
def mergeSort(alist):
count = 0
if len(alist)>1:
mid = len(alist)//2
lefthalf = alist[:mid]
righthalf = alist[mid:]
mergeSort(lefthalf)
mergeSort(righthalf)
i=0
j=0
k=0
while i < len(lefthalf) and j < len(righthalf):
if lefthalf[i] < righthalf[j]:
alist[k]=lefthalf[i]
i=i+1
else:
alist[k]=righthalf[j]
count +=len(lefthalf[i:])
j=j+1
k=k+1
while i < len(lefthalf):
alist[k]=lefthalf[i]
i=i+1
k=k+1
while j < len(righthalf):
alist[k]=righthalf[j]
j=j+1
k=k+1
return count, alist
【问题讨论】:
-
你能澄清一下你所说的“反转”吗?
-
订购数组所需的更改次数。
-
缩进错误。这使得它很难运行。看着它。
-
更改是什么意思?您要具体计算哪些操作?合并排序不使用“交换”操作。它使用“合并”操作。例如。如果你合并
[3]和[1 4],你会得到[1, 3, 4]。那么,您是否计算项目比较(1 到 3 之间只有一个)、插入(有 3 个)或合并(这将是一次合并)? -
例如,有数组[1,3,2],如果我们想要顺序你需要交换(3,2)。所以你会有一个反转。
标签: python algorithm sorting mergesort inversion