我尝试使用分而治之来创建合并排序算法。它由一个我确信是正确的mergesort递归函数组成,但在其中它调用了merge函数,该函数也是递归的,但是不起作用。因此,我想知道是否有人可以帮助我解决此问题,以便使其正常工作。我看过其他使用while循环等定义合并的解决方案,我的想法在那里,但是我想看看是否可以递归地编写merge函数。
当我实现代码时,我得到的是一个令人沮丧的空数组。
def mergesort(A):
length_A = len(A)
if length_A > 1:
return merge(
mergesort(A[0:length_A//2]),
mergesort(A[length_A//2 + 1:length_A-1]))
else:
return A
def merge(x,y):
length_x = len(x)
length_y = len(y)
if length_x == 0:
return x
if length_y == 0:
return y
if x[0] <= y[0]:
return x[0] + merge(x[1:length_x -1],y[0:length_y -1])
else:
return y[0] + merge(x[0:length_x-1],y[1:length_y -1])
A = [10, 2, 5, 3, 7, 13, 1, 6]
a = mergesort(A)
print(a)
答案 0 :(得分:1)
两件事:
在合并中,如果要合并的列表之一为空,则您不希望返回那个列表,而要返回另一个,因为这是剩下的值。换句话说,这是落后的:
if length_x == 0:
return x
if length_y == 0:
return y
应该是:
if length_x == 0:
return y
if length_y == 0:
return x
您还尝试与此连接ints和列表:
# x[0] is a number
return x[0] + merge(x[1:length_x -1],y[0:length_y -1])
像这样的东西可能会更好一些:
def mergesort(A):
length_A = len(A)
split = length_A // 2
if length_A > 1:
return merge(mergesort(A[0:split]), mergesort(A[split:]))
else:
return A
def merge(x,y):
if len(x) == 0:
return y
if len(y) == 0:
return x
if x[0] <= y[0]:
return [x[0]] + merge(x[1:], y)
else:
return [y[0]] + merge(x, y[1:])
A = [10,2,5,3,7,13,1,6]
a = mergesort(A)
print(a)
结果
[1, 2, 3, 5, 6, 7, 10, 13]