3 回答
TA贡献1798条经验 获得超3个赞
您的代码令人困惑且有缺陷:
调用排序函数并调用
merge
合并函数mergesort
。这与任何经典实现完全相反。合并函数不返回任何内容,因此
lista
并从递归调用中listb
设置为并应用于不是列表的参数。None
mergesort
len
这是修改后的版本:
def merge(lista, listb):
listc = []
while len(lista) != 0 and len(listb) != 0:
if lista[0] > listb[0]:
listc.append(listb[0])
listb.remove(listb[0])
else:
listc.append(lista[0])
lista.remove(lista[0])
if len(lista) == 0:
listc += listb
else:
listc += lista
return listc
def mergesort(list):
if len(list) < 2:
return list
else:
mid = len(list) // 2
lista = mergesort(list[:mid])
listb = mergesort(list[mid:])
return merge(lista, listb)
list = [15, 12, 14, 17, 13, 11, 12, 16, 15]
mergesort(list)
TA贡献1794条经验 获得超7个赞
首先,不要list
用作标识符。
在您的合并函数中,在 else 块中,您将返回合并排序函数返回的内容。在合并排序函数中,您什么也没有返回。
此外,由于合并函数中的递归,您最终会设置变量lista
并返回合并函数的值,因为没有返回任何内容(因此没有),因此listb
可能没有返回值。mergesort
当您将这些lista
和listb
合并排序作为参数发送时,您实际上在这种情况下发送 None ,因此当您尝试通过len
函数获取它们的长度时会出错。
要消除错误,您可以将修改后的结果发送到合并,或者可以在两个函数范围内可用的列表上工作。
TA贡献1784条经验 获得超7个赞
那是因为在您的合并函数中, lista 和 listb 正在变为 None 并传递给该函数您的 merge_sort 函数也不正确。您可以使用以下代码处理您的错误:
def mergesort(lista, listb):
listc = []
if not lista or not listb:
return None
while len(lista) != 0 and len(listb) != 0:
if lista[0] > listb[0]:
listc.append(listb[0])
listb.remove(listb[0])
else:
listc.append(lista[0])
lista.remove(lista[0])
if len(lista) == 0:
listc += listb
else:
listc += lista
print(listc)
def merge(list):
if len(list) == 0 or len(list) == 1:
return list
else:
mid = len(list) // 2
lista = merge(list[:mid])
listb = merge(list[mid:])
return mergesort(lista,listb)
list = [15, 12, 14, 17, 13, 11, 12, 16, 15]
merge(list)
添加回答
举报