使用python实现计数反转的错误结果

时间:2017-08-17 09:55:25

标签: python recursion divide-and-conquer

我尝试使用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>

我正在研究分而治之算法,因此不善于分析递归中的问题。哪里可能有问题?我该如何解决?

1 个答案:

答案 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),它允许从列表前面有效删除