为什么列表的后半部分在合并排序的递归调用中被注意操作
Why the second half of list is note operated on in a recursive call in merge sort
我接到了一项任务,要在 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)
您正在尝试使用您的 merge_sort 就好像它在适当的位置运行一样,但它没有。您需要捕获它的 return 值:
part_a = merge_sort(part_a)
part_b = merge_sort(part_b)
您的 merge_sort
函数 returns 排序列表,但在您调用它的两个位置都丢弃了结果。您需要分配结果(将其绑定到一个名称),以便您可以将这些结果传递给 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)
我认为您的说法不正确。我更新了你的 print
s 以标记输出
print "SORT A", part_a , "\tB", part_b
print "MERGE left", left, "\tright", right
并得到了预期的跟踪,直到它在合并阶段因索引处理不当而崩溃。正如其他人指出的那样,这是由于未能从 merge
.
中保存 return 值
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 评论更新
由于您的(有效)调用顺序,B 部分未被操作:算法必须先完成 A 部分的排序和合并,然后才能处理 B 部分。由于索引范围错误,您无法做到这一点.您在尝试合并 [3] 和 [7] 时犯了错误——分别是 AAA 和 AAB 部分。您从未备份堆栈(AA 和 AB)来处理原始部分 B。
我接到了一项任务,要在 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)
您正在尝试使用您的 merge_sort 就好像它在适当的位置运行一样,但它没有。您需要捕获它的 return 值:
part_a = merge_sort(part_a)
part_b = merge_sort(part_b)
您的 merge_sort
函数 returns 排序列表,但在您调用它的两个位置都丢弃了结果。您需要分配结果(将其绑定到一个名称),以便您可以将这些结果传递给 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)
我认为您的说法不正确。我更新了你的 print
s 以标记输出
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 评论更新
由于您的(有效)调用顺序,B 部分未被操作:算法必须先完成 A 部分的排序和合并,然后才能处理 B 部分。由于索引范围错误,您无法做到这一点.您在尝试合并 [3] 和 [7] 时犯了错误——分别是 AAA 和 AAB 部分。您从未备份堆栈(AA 和 AB)来处理原始部分 B。