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)
添加回答
舉報