使用两个递归函数合并排序,而不是一个递归和一个迭代

时间:2019-05-27 16:19:05

标签: python recursion mergesort

我尝试使用分而治之来创建合并排序算法。它由一个我确信是正确的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)

1 个答案:

答案 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]