在理解如何在Python的Merge sort中存储和传递值的概念时出现问题

问题描述

def merge_sort(arr):
    if len(arr) <= 1:
        return

    mid = len(arr) // 2
    left_half = arr[:mid]
    right_half = arr[mid:]
    print("Before " + str(left_half),str(right_half))

    merge_sort(left_half)
    merge_sort(right_half)

    print("After " + str(left_half),str(right_half))

    i = 0
    j = 0
    k = 0

    while i < len(left_half) and j < len(right_half):
        if left_half[i] <= right_half[j]:
            arr[k] = left_half[i]
            i += 1
        else:
            arr[k] = right_half[j]
            j += 1
        k += 1

    while i < len(left_half):
        arr[k] = left_half[i]
        i += 1
        k += 1

    while j < len(right_half):
        arr[k] = right_half[j]
        j += 1
        k += 1

if __name__ == "__main__":
li = list(map(int,input().split()))
merge_sort(li)
print(li)

输入:3 34 1 2 1 3 2

输出

Before [3,34,1] [2,1,3,2]
Before [3] [34,1]
Before [34] [1]
After [34] [1]
After [3] [1,34]
Before [2,1] [3,2]
Before [2] [1]
After [2] [1]
Before [3] [2]
After [3] [2]
After [1,2] [2,3]
After [1,34] [1,2,3]
[1,34]

我对python的工作原理有基本的了解,并且此代码也可以正常工作,但是我不明白,如果我们不返回任何内容来更新left_half或{{1} },它们如何更改和存储排序后的值? 由于排序后的值存储在right_half中,因此我们没有在任何地方返回这些值。

请帮助! 谢谢。

解决方法

left_halfright_half是使用以下命令定义的临时数组:

left_half = arr[:mid]    // left_half is a copy of the left half of arr
right_half = arr[mid:]   // right_half is a copy of the right half of arr

通过对merge_sort的递归调用对它们进行排序:

merge_sort(left_half)
merge_sort(right_half)

排序后的两半中的值然后合并回到arr中,并在适当位置进行更新,并且这些临时数组在从merge_sort返回时将被丢弃。

merge_sort是一个递归函数:为每个调用创建一组不同的临时数组。