【问题标题】:Merge sort using two recursive functions rather than one recursive and one iterative使用两个递归函数而不是一个递归和一个迭代进行合并排序
【发布时间】:2019-05-27 16:19:05
【问题描述】:

我尝试使用分而治之来创建合并排序算法。它由一个合并排序递归函数组成,我相信它是正确的,但在其中它调用了一个合并函数,它也是递归的,但不起作用。所以我想知道是否有人可以帮助我解决这个问题以使其正常工作。我已经看到了使用 while 循环等定义合并的其他解决方案,我在那里得到了想法,但我想看看是否可以递归地编写合并函数。

目前,当我实现代码时,我只得到一个空数组,这令人沮丧。

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)

【问题讨论】:

  • 你的缩进有问题,请修复。
  • 括号内不需要反斜杠来续行。
  • 递归合并会起作用,但它需要 O(n) 堆栈空间来合并 n 个节点,这可能导致大列表的堆栈溢出。

标签: python recursion mergesort


【解决方案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

你也试图用这个来连接整数和列表:

# 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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 2014-10-07
    • 2021-10-11
    • 2021-09-27
    • 2016-02-09
    • 2018-01-04
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多