我的合并排序代码如下。当我在测试数组5,3,2,1,8,4,9,11上运行它时,我得到了错误:"TypeError:'NoneType‘类型的对象没有len()",它在merge方法的开头抛出。我的打印输出如下:-正在尝试合并左侧:5-正在尝试合并右侧:3-合并数组: 3,5-正在尝试合并左侧:2-正在尝试合并右侧:1-合并数组: 1,2-正在尝试合并左侧:无-正在尝试合并右侧:无
看起来我已经成功地合并了前4个元素,然后它尝试合并两个空元素,我不知道为什么会这样。
def mergeSort(array, size):
# BASE CASE
if size <= 1:
return array
#split in half recursively and once they're all one element, merge
else:
left = mergeSort(array[:size / 2], size / 2)
right = mergeSort(array[size / 2:], size / 2)
temp = merge(left, right)
print "merged array: ", temp
def merge(leftElements, rightElements):
print("trying to merge left: "), leftElements
print("trying to merge right: "), rightElements
lengthLeft = len(leftElements)
lengthRight = len(rightElements)
mergedArray = []
# - i is the index for leftElements
# - j is the index for rightElements
i = 0
j = 0
while (i < lengthLeft):
while (j < lengthRight):
if leftElements[i] < rightElements[j]:
mergedArray.append(leftElements[i])
i += 1
elif leftElements[i] > rightElements[j]:
mergedArray.append(rightElements[j])
j += 1
else:
mergedArray.append(leftElements[i])
mergedArray.append(rightElements[j])
i += 1
j += 1
booleanLeft = i >= lengthLeft
booleanRight = j >= lengthRight
if ((i >= lengthLeft) or (j >= lengthRight)):
break
if ((i >= lengthLeft) or (j >= lengthRight)):
break
# now need to account for the case when one array clears before the other
if (i < lengthLeft):
for q in range(i, lengthLeft):
mergedArray.append(leftElements[q])
if (j < lengthRight):
for q in range(j, lengthRight):
mergedArray.append(rightElements[q])
return mergedArray
print(mergeSort([5, 3, 2, 1, 8, 4, 9, 11], 8))发布于 2015-08-04 05:24:57
您的mergeSort函数不返回任何内容
因此,根据定义,它现在返回,这就是nones的来源。
只需添加一个回车符,您就应该没问题。
https://stackoverflow.com/questions/31796778
复制相似问题