[英]Merge sort for python
這是我的merge
和merge
mergeSort
功能。 merge
合並兩個單獨的數組並mergesSort
排序並使用遞歸合並它們:
def merge(arrL, arrR):
arrNew = []
d = len(arrL) + len(arrR)
i = 0
j = 0
for k in range (0, d-1):
if (arrL[i] < arrR[j]) :
arrNew.append(arrL[i]) # appends to the end of the array
i = i + 1
else:
arrNew.append(arrR[j])
j = j + 1
return arrNew
def mergeSort(arr, m, n):
if (n - m == 1):
return arr[m]
else:
p = (m + n) // 2
arrL = mergeSort(arr, m, p)
arrR = mergeSort(arr, p, n)
arrNew = merge(arrL, arrR)
return arrNew
我在第 32、33 和 13 行收到錯誤消息:
d = len(arrL) + len(arrR)
TypeError: object of type 'int' has no len()
是什么導致了這個錯誤? 合並將兩個數組作為輸入。
是什么導致了這個錯誤?
merge
將兩個數組作為輸入。
除非它沒有。
if(n-m == 1):
return arr[m]
mergeSort
這個輸出不是一個數組。
我猜是這條線
if(n-m == 1):
return arr[m]
這大概是返回數組的內容arr[m]
而不是數組本身。
由於您的代碼對數組進行排序,當這個裸元素被遞歸時,它會產生您看到的錯誤。
代碼中存在多個問題:
在mergeSort
,當數組的長度小於 2 時,您應該返回arr
而不是arr[m]
。測試if (n - m == 1)
不允許空數組:
if (n - m < 2): return arr
在merge
,主循環應該運行d
次,即:而不是for k in range (0, d-1):
你應該寫:
for k in range (d):
合並循環中的測試還應檢查索引值是否仍在范圍內。 如果第二個切片用完,則應選擇元素arrL[i]
:
for k in range (d): if i < len(arrL) and (j >= len(arrR) or arrL[i] < arrR[j]): arrNew.append(arrL[i]) i = i + 1 else: arrNew.append(arrR[j]) j = j + 1
這是一個修改后的版本:
def merge(arrL, arrR):
arrNew = []
i = 0
j = 0
for k in range(len(arrL) + len(arrR)):
if i < len(arrL) and (j >= len(arrR) or arrL[i] < arrR[j]):
arrNew.append(arrL[i])
i = i + 1
else:
arrNew.append(arrR[j])
j = j + 1
return arrNew
def mergeSort(arr, m, n):
if (n - m < 2):
return arr
else:
p = (m + n) // 2
arrL = mergeSort(arr, m, p)
arrR = mergeSort(arr, p, n)
return merge(arrL, arrR)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.