【问题标题】:inversion count using merge sort python使用归并排序python的反转计数
【发布时间】:2014-08-08 18:39:35
【问题描述】:

我正在使用倒数计数实现合并排序。 我的代码适用于我的小输入文件(10 个元素),但是当它达到 100000 时, 似乎从蛮力搜索返回了不正确的答案。有时更大,有时更小。有人知道吗?

我的代码返回 2402298631。 输入文件位置 http://spark-public.s3.amazonaws.com/algo1/programming_prob/IntegerArray.txt

def msort_inv2(m):

    global count

    if len(m) <= 1:
        return m
    result = []
    middle = int(len(m)/2)

    left = msort_inv2(m[:middle])
    right = msort_inv2(m[middle:])

    while (len(left) > 0) or (len(right) > 0):
        if (len(left) > 0) and (len(right) > 0):
            if left[0] > right[0]:
                result.append(right[0])
                count = count + len(left)
                right.pop(0)
            else:
                result.append(left[0])
                left.pop(0)
        elif len(right) > 0:
            for i in right:
                result.append(i)
                right.pop(0)
        else:
            for i in left:
                result.append(i)
                left.pop(0)
    return result

【问题讨论】:

  • 请提供您的代码的minimal example 以及比“似乎不正确” 更好的问题描述(提供输入以及预期和实际输出)。
  • 如果您发布一些代码可能会有所帮助
  • 您的代码是“返回”还是“输出”2402298631?

标签: python sorting merge count inversion


【解决方案1】:

bug 存在于以下部分

    elif len(right) > 0:
        for i in right:     # bug !!!!
            result.append(i)
            right.pop(0)
    else:
        for i in left:
            result.append(i)
            left.pop(0)

修正应该是这样的

    elif len(right) > 0:
        result.extend(right)
        right = []
    else:
        result.extend(left)
        left = []

for循环在数组中同时弹出item,在python中会导致奇怪的行为。

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2014-08-04
    • 2014-10-31
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多