【发布时间】:2017-11-05 17:36:00
【问题描述】:
我了解归并排序是如何工作的,但是当我尝试在 python 中实现时,我想我仍然对堆栈上的实际情况感到有些困惑。我有一个名为 merge_sorted_list 的函数,用于合并两个排序列表,还有一个名为 merge_sort1 和 merge_sort2 的函数,它们用于递归过程。 "merge_sort1" 和 "merge_sort2" 非常相似,但只有 merge_sort2 给出了正确答案。看起来 merge_sort1 没有在堆栈的每一级获取返回值。谁能告诉我 merge_sort1 和 merge_sort2 的评估有什么区别?
def merge_sorted_list(list1,list2):
if(len(list1) == 0 or len(list2) == 0):
print('input error')
return;
i = 0
j = 0
k = 0
list_merge = [0]*(len(list1) + len(list2))
while(i < len(list1) and j < len(list2)):
if (list1[i] < list2[j]):
list_merge[k] = list1[i]
i += 1
else:
list_merge[k] = list2[j]
j += 1
k += 1
while(i < len(list1)):
list_merge[k] = list1[i]
i += 1
k += 1
while (j < len(list2)):
list_merge[k] = list2[j]
j += 1
k += 1
return(list_merge)
def merge_sort1(mylist):
print("splitting ",mylist)
if (len(mylist) > 1):
mid = len(mylist)//2
merge_sort1(mylist[:mid])
merge_sort1(mylist[mid:])
# lefthalf = mylist[:mid]
# righthalf = mylist[mid:]
# merge_sort1(lefthalf)
# merge_sort1(righthalf)
mylist[:] = merge_sorted_list(mylist[:mid],mylist[mid:])
print("merging result ",mylist)
return mylist
def merge_sort2(mylist):
print("splitting ",mylist)
if (len(mylist) > 1):
mid = len(mylist)//2
# merge_sort2(mylist[:mid])
# merge_sort2(mylist[mid:])
lefthalf = mylist[:mid]
righthalf = mylist[mid:]
merge_sort2(lefthalf)
merge_sort2(righthalf)
mylist[:] = merge_sorted_list(lefthalf,righthalf)
print("merging result ",mylist)
return mylist
如果我们尝试 merge_sort1([4,67,3,3,2,6]),输出将是
('splitting ', [4, 67, 3, 3, 2, 6])
('splitting ', [4, 67, 3])
('splitting ', [4])
('splitting ', [67, 3])
('splitting ', [67])
('splitting ', [3])
('merging result ', [3, 67])
('merging result ', [4, 67, 3])
('splitting ', [3, 2, 6])
('splitting ', [3])
('splitting ', [2, 6])
('splitting ', [2])
('splitting ', [6])
('merging result ', [2, 6])
('merging result ', [2, 3, 6])
('merging result ', [3, 2, 4, 6, 67, 3])
merge_sort2([4,67,3,3,2,6]) 的输出将是
('splitting ', [4, 67, 3, 3, 2, 6])
('splitting ', [4, 67, 3])
('splitting ', [4])
('splitting ', [67, 3])
('splitting ', [67])
('splitting ', [3])
('merging result ', [3, 67])
('merging result ', [3, 4, 67])
('splitting ', [3, 2, 6])
('splitting ', [3])
('splitting ', [2, 6])
('splitting ', [2])
('splitting ', [6])
('merging result ', [2, 6])
('merging result ', [2, 3, 6])
('merging result ', [2, 3, 3, 4, 6, 67])
非常感谢
【问题讨论】:
-
为什么不添加一些仪器并找出自己?
-
merge_sort是在哪里定义的?您的merge_sort1致电merge_sort。
标签: python recursion mergesort