我试图通过自己编写来理解算法。在尝试复制合并排序时,我遇到了一些麻烦:左和右; right return none-type,并在第一个while循环中为len(左)引发错误。我一直在与代码斗争,无法弄清楚我错过了什么?它不应该循环,直到左右列表的大小减少到1,这将允许它们离开if循环并继续函数的下一部分?
def merge_sort(A):
if len(A) < 2:
return A
else:
mid= len(A)//2
left= merge_sort(A[:mid])
right= merge_sort(A[mid:])
i = j = 0
sortedlist = []
while i < len(left) and j < len(right):
if left[i] < right[j]:
sortedlist.append(left[i])
i+=1
else:
sortedlist.append(right[j])
j+=1
while i < len(left):
sortedlist.append(left[i])
i+=1
while j < len(right):
sortedlist.append(right[j])
j+=1
print(str(sortedlist))
答案 0 :(得分:1)
您的函数不包含return语句。你应该在它的最后添加return sortedlist
。
答案 1 :(得分:1)
您需要做的就是添加一个return语句(下面代码中的最后一个语句):
def merge_sort(A):
if len(A) < 2:
return A
else:
mid= len(A)//2
left = merge_sort(A[:mid])
right = merge_sort(A[mid:])
i = j = 0
sortedlist = []
while i < len(left) and j < len(right):
if left[i] < right[j]:
sortedlist.append(left[i])
i+=1
else:
sortedlist.append(right[j])
j+=1
while i < len(left):
sortedlist.append(left[i])
i+=1
while j < len(right):
sortedlist.append(right[j])
j+=1
# NEED TO RETURN THE LIST HERE!
return sortedlist
如果您的函数未返回任何语句,例如left = merge_sort(A[:mid])
,则会将None
分配给left
,而不是排序(一半)列表。
然后你可以用:
进行测试import random
lst = list(range(15))
random.shuffle(lst)
ret = merge_sort(lst)
print(ret)