【发布时间】:2018-01-25 16:23:34
【问题描述】:
我正在尝试使用 python 实现带有 mergeSort 的计数版本,这是我的代码:
def merge(inLeft, inRight):
inversions = 0; output = []
while 0 < len(inLeft) and 0 < len(inRight):
if inLeft[0] < inRight[0]:
output.append(inLeft[0])
inLeft.remove(inLeft[0])
else:
output.append(inRight[0])
inRight.remove(inRight[0])
inversions += len(inLeft)
if len(inLeft) == 0:
output.append(inRight[0])
elif len(inRight) == 0:
output.append(inLeft[0])
return output, inversions
def mergeSort(inList):
length = len(inList)
if length == 1:
return inList, 0
left, s1 = mergeSort(inList[: length//2])
right, s2 = mergeSort(inList[length//2: ])
sortedList, s3 = merge(left, right)
return sortedList, (s1+s2+s3)
我以为当我通过mergeSort([1, 3, 5, 2, 4, 6]) 调用它时会得到([1, 2, 3, 4, 5, 6], 3),但实际上我得到了([1, 2, 3, 4], 1),当我检查它时,我发现left 数组总是<built-in function sorted>。
我正在研究分治算法,因此不擅长递归分析问题。问题可能出在哪里?我该如何解决?
【问题讨论】:
-
听起来你的实际代码使用了一个变量
sorted,它实际上是python中的一个内置函数。 -
@quamrana 我再次检查了代码,确实有一个变量
sorted,但它存在于另一个不参与该过程的函数中。更新了代码,现在是完整的脚本。
标签: python recursion divide-and-conquer