我在Python代码中的合并排序返回[0]

时间:2017-11-03 15:48:45

标签: python python-3.x sorting merge mergesort

我正在制作合并排序代码,但它没有排序。你看到它有什么问题吗?

def mergeSort(L):
if len(L) == 1:
    return L
else:
    # divide
    L1 = mergeSort(L[0:round(len(L)/2)])
    L2 = mergeSort(L[round(len(L)/2):len(L)])

    # merge
    i = 0
    j = 0
    K = []
    while i < len(L1) and j < len(L2):
        if L1[i] < L2[j]:
            K.append(L1[i])
            i=i+1
        else:
            K.append(L2[j])
            j=j+1
    return K

输入:

L = [1,2,5,7,8,0,10,21,32,53,16,16,48,59,64,53,75,52,42,21,98,76‌​] 

输出:

L = [0]

3 个答案:

答案 0 :(得分:6)

while i < len(L1) and j < len(L2):

这对我来说并不合适。在这种情况下,一旦i或j到达各自列表的末尾,循环将结束。其他列表中可能仍然存在永远不会迭代的元素。

尝试将and更改为or,并添加一些检查以确保只有当列表尚未完全迭代时才会发生列表间比较:

    while i < len(L1) or j < len(L2):
        if i < len(L1) and (j == len(L2) or L1[i] < L2[j]):
            K.append(L1[i])
            i=i+1
        else:
            K.append(L2[j])
            j=j+1

现在您的代码输出[0, 1, 2, 5, 7, 8, 10, 16, 16, 21, 21, 32, 42, 48, 52, 53, 53, 59, 64, 75, 76, 98]

答案 1 :(得分:2)

考虑这一行:

while i < len(L1) and j < len(L2):

例如,如果L1中的所有元素都小于L2中的所有元素,则此循环会将L1中的所有元素放入结果K中。然后循环将结束,将忽略<{1}}的所有内容。当循环结束时,您需要清除剩余的元素。在循环之后立即添加这行代码:

L2

顺便说一下,我通过使用输入K.extend(L1[i:] + L2[j:]) 的调试器逐步执行代码来找到它。我发现当我只通过L=[2,1]循环进行一次迭代时,由于每个循环迭代添加一个元素,结果中只能有一个元素。如果您还不知道如何使用调试器逐步执行代码,那么现在是学习的好时机。

答案 2 :(得分:1)

在 while 条件下,“与”操作应该已更改为“或”,然后您的问题就解决了。

def merge_sort(L):
    if len(L) == 1:
        return L

    else:
        # divide
        L1 = merge_sort(L[0:round(len(L) / 2)])
        L2 = merge_sort(L[round(len(L) / 2):len(L)])

        # merge
        i = 0
        j = 0
        K = []
        while i < len(L1) or j < len(L2):
            if i < len(L1) and (j == len(L2) or L1[i] < L2[j]):
                K.append(L1[i])
                i = i + 1
            else:
                K.append(L2[j])
                j = j + 1
        return K

现在您将获得所需的输出,并且不会显示零。