[英]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.