[英]Merge Sort Problems - Python
我的代码有什么问题? 它仅输出vect值的一部分。 似乎while循环在某个时刻中断。 我不明白为什么。
def print_list(vect):
for i in range(0, len(vect)):
print(vect[i])
def merge_sort(vect):
left = []
right = []
result = []
for i in range(0, int(len(vect)/2)):
left.append(vect[i])
for i in range(int(len(vect)/2), len(vect)):
right.append(vect[i])
left.sort()
right.sort()
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
print(len(result))
return result
vect = [3, 1, 5, 7, 10, 2, 0]
vect = merge_sort(vect)
好吧,你的错误是你的while循环之后
while i < len(left) and j < len(right):
...
i < len(left)
或j < len(right)
可能是(而且很可能是j < len(right)
,因此您需要在答案后面加上适当部分的后缀。 这很容易做到
result += left[i:]
result += right[j:]
说明:
想象一下合并过程:您在开始时将i和j设为0,然后在每一步中都将它们之一向前移动。 什么时候停止? 当其中之一到达终点时。 假设我已经结束了。 因此,您将整个左侧部分添加到了结果中,但是j和len(right)之间的右侧仍然有一些元素,因此您也必须将它们添加到答案中。
台面 :
您正在执行合并排序,所以请
left = merge_sort( left )
right = merge_sort( right )
代替
left.sort()
right.sort()
注意:您必须在合并功能开始时在代码中添加以下检查,以避免无限递归:
if len( vect ) == 1:
return vect
同样在print_list函数中,您可以使用
print vect
或至少
for x in vect
print x
一旦左侧或右侧耗尽,while循环就会退出。 这使未用尽列表中剩余的所有元素都不会合并。
将代码更改为此:
def print_list(vect):
for i in range(0, len(vect)):
print(vect[i])
def merge_sort(vect):
left = []
right = []
result = []
for i in range(0, int(len(vect)/2)):
left.append(vect[i])
for i in range(int(len(vect)/2), len(vect)):
right.append(vect[i])
left.sort();
right.sort();
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
if i < len(left):
result.extend(left[i:])
else:
result.extend(right[j:])
print(len(result))
return result
vect = [3, 1, 5, 7, 10, 2, 0]
vect = merge_sort(vect)
print vect
如果您在左右使用sort方法,那么为什么您不只在整个列表中使用它,我有点困惑。 但是我想你有你的理由。 :)
编辑:我把整个代码块放在那里,以便您可以看到它。 当我运行此命令时,它会打印[0,1,2,3,5,7,10],这是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.