【发布时间】:2017-12-31 10:17:41
【问题描述】:
我已经完成了 MergeSort 算法,但我不知道如何计算交换次数。
我的代码是:
def mergesortInv(list):
if len(list) < 2:
return list
else:
middle = len(list) // 2
left = mergesortInv(list[:middle]) #definim les dues meitats
right = mergesortInv(list[middle:])
swaps=???
return mergeInv(left, right,swaps)
def mergeInv(left, right,swaps):
if len(left) < 1:
return right
if len(right) < 1:
return left
if left[0] <= right[0]:
return [left[0]] + mergeInv(left[1:],right,swaps)
else:
return [right[0]] + mergeInv(left,right[1:],swaps)
该算法的输出将是排序列表(该算法在这部分工作)和交换次数:mergesortInv(list) == ([1, 2, 3, 4, 5, 7, 8], 6) 6 是交换次数。
【问题讨论】:
-
交换发生在
mergeInv方法的else部分内。如果您每次到达那里时都增加一个索引,那应该代表最后的总掉期。但是您可能必须更改建议的函数签名。要么保留一个全局索引(坏),要么返回每个mergeInvcall 中的交换次数并累积它们(好)。 -
请参阅Counting inversions in an array。那里的答案显示了如何使用归并排序来计算反转,但还有其他方法可以做到这一点。请查看我的答案,该答案比较了不同列表大小上各种算法的速度。
-
@Anubis 我会试试你给我的最后一个选项
-
顺便说一句,使用
list作为变量名不是一个好主意,因为这会影响内置的list类型。它不会在这里造成任何伤害,但它会使阅读您的代码有点混乱。如果出于某种原因您尝试在mergesortInv中使用list来创建列表,您会收到一条神秘的错误消息。 -
我使用了
list,因为它是一个中性名称,但在我原来的算法中我有另一个名称。