理解递归合并排序过程背后的直觉

2024-02-07

我对以下代码的以下输出感到困惑:

def msort3(x):
    print("splitting:",x)
    result = []
    if len(x) < 2:
        print("merging:",x)
        return x

    mid = int(len(x) / 2)
    y = msort3(x[:mid])
    print(y)
    z = msort3(x[mid:])  ## this will be run when x is 87
    print(z)
    i = 0
    j = 0
    while i < len(y) and j < len(z):
        if y[i] > z[j]:
            result.append(z[j])
            j += 1
        else:
            result.append(y[i])
            i += 1
    result += y[i:]
    result += z[j:]
    print("result is ", result)
    return result


if __name__ == '__main__':
     print("hi", msort3([17,87,6,22]))

一些输出是:

splitting: [17, 87, 6, 22]
splitting: [17, 87]
splitting: [17]
merging: [17]
[17]
splitting: [87]
merging: [87]
[87]
result is  [17, 87]
[17, 87]
splitting: [6, 22]

现在它是怎么读的[6, 22]?我想当我们得到时递归调用已经完成result = [ 17,87].

请帮忙,我很困惑并且已经在这里跟踪了代码http://interactivepython.org/courselib/static/pythonds/SortSearch/TheMergeSort.html http://interactivepython.org/courselib/static/pythonds/SortSearch/TheMergeSort.html.


所以我尝试编写一个如下所示的堆栈:

We need to merge sort: [17,87,6,22]

要做到这一点,we need to merge sort [ 17,87]要做到这一点,we need to merge sort [17]

我们在这里得到了一个基本案例,并且合并了[17] is 17

然后我们回去,我们进行合并[87]

我想在对这两个值进行排序后我仍然感到困惑,为什么它会再次出现并且为其他值再次调用归并排序的两个函数? 我假设在合并排序 [87] 和 17 结束时。执行将结束。

我写了堆栈,我可以看到它仍然需要对整个列表进行排序合并,但是它如何在每次调用函数时维护 left 和 right 的值。我对执行感到困惑

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解递归合并排序过程背后的直觉 的相关文章

随机推荐