问题描述
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_half
和right_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
是一个递归函数:为每个调用创建一组不同的临时数组。