我有一个任务在python中实现合并排序。我已经编写了代码,但我仍然坚持为什么代码在递归调用后没有打印列表的part_b,我该怎样修复它。
以下是代码
def merge_sort(list_sort):
"""splits the list in two parts until each part is left with one member"""
if len(list_sort) == 1:
print len(list_sort)
return list_sort
if len(list_sort)>= 2:
x= len(list_sort) / 2
part_a = list_sort[:x]
part_b = list_sort[x:]
print part_a , part_b
merge_sort(part_a)
merge_sort(part_b)
return merge(part_a, part_b)
def merge(left , right):
"""merges the two parts of list after sorting them"""
print left, right
sorted_list = []
if len(left) >= len(right):
i = len(left)
while i != 0:
if left[i] > right[i]:
sorted_list.append(right[i])
else :
sorted_list.append(left[i])
i = i-1
sorted_list += right[i:]
else :
i = len(right)
while i != 0:
if left[i] > right[i]:
sorted_list.append(right[i])
else :
sorted_list.append(left[i])
i = i-1
sorted_list += left[i:]
return sorted_list
details = [3, 7, 5, 12, 14, 11, 2, 6]
print merge_sort(details)
答案 0 :(得分:1)
您正在尝试使用merge_sort,就像它在适当的位置操作一样,但它没有。您需要捕获其返回值:
recipient_id
答案 1 :(得分:1)
您的merge_sort
函数会返回已排序的列表,但在您调用它的两个位置都会丢弃结果。您需要分配结果(将其绑定到名称),以便将这些结果传递给merge
:
if len(list_sort) >= 2:
x= len(list_sort) / 2
part_a = list_sort[:x]
part_b = list_sort[x:]
print part_a , part_b
sorted_part_a = merge_sort(part_a)
sorted_part_b = merge_sort(part_b)
return merge(sorted_part_a, sorted_part_b)
答案 2 :(得分:1)
我认为你的说法不正确。我更新了您的print
以标记输出
print "SORT A", part_a , "\tB", part_b
print "MERGE left", left, "\tright", right
并获得预期的跟踪,直到它在合并阶段的索引处理不当崩溃。正如其他人所指出的那样,这是因为未能保存merge
的返回值。
SORT A [3, 7, 5, 12] B [14, 11, 2, 6]
SORT A [3, 7] B [5, 12]
SORT A [3] B [7]
1
1
MERGE left [3] right [7]
Traceback (most recent call last):
File "so.py", line 44, in <module>
print merge_sort(details)
File "so.py", line 13, in merge_sort
merge_sort(part_a)
File "so.py", line 13, in merge_sort
merge_sort(part_a)
File "so.py", line 16, in merge_sort
return merge(part_a, part_b)
File "so.py", line 26, in merge
if left[i] > right[i]:
IndexError: list index out of range
每个OP COMMENT更新
由于你的(有效)调用顺序,B部分没有被操作:算法必须在部分B工作之前完成排序和合并部分A.由于索引范围错误,你没有那么远。你试图合并[3]和[7] - 分别是AAA和AAB。你从来没有把它备份到堆栈(AA和AB)来处理原始的B部分。