【问题标题】:Python-Merge sort difficultiesPython-合并排序困难
【发布时间】:2015-01-24 05:04:22
【问题描述】:

我尝试实现合并排序,这是我的代码:

def mergeSort(array):
    result=[]
    n=len(array)
    if n==1:
        result=array
    else:
        a=round(n/2)
        first=mergeSort(array[0:a])
        second=mergeSort(array[a:n])

        for i in range(len(first)):
            for j in range(len(second)):
                if first[i]<second[j]:
                    result.append(first[i])
                    i=i+1
                else:
                    result.append(second[j])
                    j=j+1
    return result

a=[5,4,1,8,7,6,2,3]
b=mergeSort(a)
print(b)

不幸的是,结果是[1]。我的功能有什么问题?

【问题讨论】:

  • 只是一个快速提示,与问题无关。 Python有一个枚举,而不是使用for i in range(len(my_list)),而是使用for i, value in enumerate(my_list),它解包值并分配一个索引(从0开始)。

标签: python mergesort


【解决方案1】:

很多东西...

首先,这是一个递归函数,这意味着您不能像在此处那样在函数中创建列表:

result=[]

这只会在每次递归调用后重置您的列表,从而扭曲您的结果。最简单的做法是更改作为参数传递给归并排序的列表。

你的下一个问题是你在一个 for 循环中有一个 for 循环。这是行不通的,因为第一个 for 循环遍历 first,而第二个 for 循环将遍历 second,每增加一个 i,这不是您想要的。您需要比较 firstsecond 并提取最小值,然后提取下一个最小值,依此类推,直到获得排序列表。 因此,您的 for 循环需要更改为以下内容:

while i < len(first) and j < len(second):

这导致我在您的代码中遇到了最后一个问题。 while 循环将在满足其中一个条件后退出,这意味着ij(其中一个)将不会到达len(first)len(second)。换句话说,firstsecond 中将有一个值无法解释。您需要将此未计入的值添加到排序列表中,这意味着您必须在函数末尾实现此最终摘录:

remaining = first if i < j else second
r = i if remaining == first else j

while r < len(remaining):
    array[k] = remaining[r]
    r = r + 1 
    k = k + 1

这里r 表示前一个while 循环中断的索引值。然后,while 循环将遍历其余的值;将它们添加到排序列表的末尾。

您的合并排序现在应该如下所示:

def mergeSort(array):
    if len(array)==1:
        return array
    else:
        a=round(len(array)/2)
        first=mergeSort(array[:a])
        second=mergeSort(array[a:])
        i = 0
        j = 0
        k = 0
        while i < len(first) and j < len(second):
            if first[i]<second[j]:
                array[k] = first[i]
                i=i+1
                k=k+1
            else:
                array[k] = second[j]
                j=j+1
                k=k+1

        remaining = first if i < j else second
        r = i if remaining == first else j

        while r < len(remaining):
            array[k] = remaining[r]
            r += 1; k += 1

    return array

为了让您更容易理解,我尽量不更改您的代码。但是,如果您仍然难以理解我所做的事情,请尝试使用多个打印语句调试您的合并排序,以便您可以跟踪函数的进度并查看哪里出错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2020-12-17
    • 2019-10-17
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多