我尝试使用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>
。
我正在研究分而治之算法,因此不善于分析递归中的问题。哪里可能有问题?我该如何解决?
答案 0 :(得分:0)
if len(inLeft) == 0:
output.append(inRight[0])
elif len(inRight) == 0:
output.append(inLeft[0])
这只会将第一个元素添加到输出中。更改为output.extend(inRight) / output.extend(inLeft)
以有效添加整个阵列。这将修复你缺少的元素。
此外,Python列表的remove
操作具有O(N)
复杂度,因此您可能需要考虑使用deque(collections.deque),它允许从列表前面有效删除