算法反转次数(Python)

时间:2019-02-19 06:01:47

标签: python algorithm recursion mergesort inversion

我正在尝试为Coursera上的UC圣地亚哥分校提供的算法工具箱完成代码分配。分配要求您使用合并排序算法的变体来计算数字序列中的求反数。有关问题的更好描述:

https://i.stack.imgur.com/CCBU8.jpg

我使用了合并排序算法的一种变体,但答案不正确,并且坦率地说卡住了。

值得注意的是,在解释我尝试过的内容之前,这段代码涉及到递归,我承认我很难理解。

在通常的调试之外,我试图将代码与已知的解决方案进行比较,以查看可能出问题的地方。我可以提交这些作为我的解决方案,但就我所担心的那是个骗子,我想知道我的代码出了什么问题(老实说,这让我发疯了)。

#Uses python3
import sys

def merge_sort(A):
    if len(A) <= 1:
        return A, 0    
    else:
        middle = (len(A)//2)
        left, count_left = merge_sort(A[:middle])
        right, count_right = merge_sort(A[middle:])
        result, count_result = merge(left,right)
        return result, (count_left + count_right + count_result)

def merge(a,b):
    result = []
    count = 0
    while len(a) > 0 and len(b) > 0:
        if a[0] < b[0]:
            result.append(a[0])
            a.remove(a[0])
        else:
            #count = count + (len(a) - 1)
            result.append(b[0])
            b.remove(b[0])
            count += (len(a) - 1) #this is the important line
    if len(a) == 0:
        result = result + b
    else:
        result = result + a
    return result, count 

if __name__ == '__main__':
    input = sys.stdin.read()
    n, *a = list(map(int, input.split()))
    c = n * [0]
    array, inversion = merge_sort(a)
    print(array)
    print(inversion)

下面列出了我在测试中一直使用的两个示例输入:

# ex 1:
3
3 1 2

请注意,第一个数字是序列中值的数量(对于平地机是必需的)。求反演的答案是2。我的代码得到0。

# ex 2:
6
3 1 9 3 2 1

反演的预期答案是9。我得到4。

1 个答案:

答案 0 :(得分:0)

两个更正:

if a[0] <= b[0]:(请注意,许多Internet示例和课程都忽略了or equal情况,破坏了算法的内在稳定性,这种情况对于正确的盘点也很重要)

count += len(a)-我们需要说明a中的所有项目都与当前b项目形成倒置

def merge(a,b):
    result = []
    count = 0
    while len(a) > 0 and len(b) > 0:
        if a[0] <= b[0]:   
            result.append(a[0])
            a.remove(a[0])
        else:
            result.append(b[0])
            b.remove(b[0])
            count += len(a)
    if len(a) == 0:
        result = result + b
    else:
        result = result + a
    return result, count