我正在尝试使用python 3.7实现合并排序。为此,我编写了merge()函数和递归sort()函数。在这里,sort()函数将中断列表,直到它具有一个元素为止。但是问题是解释器无法将合并函数的参数m和n识别为列表,因此显示以下错误:
def merge(m, n):
x = y = 0
v = []
while x < len(m) and y < len(n):
if m[x] < n[y]:
v.append(m[x])
x = x + 1
elif m[x] > n[y]:
v.append(n[y])
y = y + 1
else:
v.append(m[x])
x, y = x + 1, y + 1
while x < len(m):
v.append(m[x])
x = x + 1
while y < len(n):
v.append(n[y])
y = y + 1
return v
def sort(a):
if len(a) == 1:
return a
else:
merge(sort(a[:len(a) // 2]), sort(a[len(a) // 2:]))
x = list(range(10, 0, -1))
sort(x)
print(x)
预期结果ID为排序列表。
但是python显示此错误:
回溯(最近通话最近):
文件“”,第1行,位于
排序(x)
文件“”,第5行,排序
merge(sort(a [:len(a)// 2]),sort(a [len(a)// 2:]))
文件“”,第5行,排序
merge(sort(a [:len(a)// 2]),sort(a [len(a)// 2:]))
文件“”,第5行,排序
merge(sort(a [:len(a)// 2]),sort(a [len(a)// 2:]))
合并中的文件“”,第4行
而x
答案 0 :(得分:0)
重点是您的排序函数的确会在len(a)== 1的情况下返回a,但在len(a)!= 1的情况下不返回任何内容。它应该返回的是merge(…)而不是merge(…)在您排序的其他部分。
答案 1 :(得分:0)
修复注释中指出的问题。或者,可以一次性分配工作数组,并且合并排序将仅使用索引,而不是制作数组的多个副本。
def merge(m, n):
x = y = 0
v = []
while x < len(m) and y < len(n):
if m[x] <= n[y]: # fix
v.append(m[x])
x = x + 1
else:
v.append(n[y])
y = y + 1
while x < len(m):
v.append(m[x])
x = x + 1
while y < len(n):
v.append(n[y])
y = y + 1
return(v)
def sort(a):
if len(a) == 1:
return(a)
else:
return(merge(sort(a[:(len(a)//2)]), sort(a[len(a)//2:])))
# test sort
x = list(range(10, 0, -1))
x = sort(x) # fix
print(x)