【问题标题】:Why return value is 0 when use Mergesort in Python?为什么在 Python 中使用 Mergesort 时返回值为 0?
【发布时间】:2017-11-03 15:48:44
【问题描述】:

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

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]

【问题讨论】:

  • 显示给定输入的输出。
  • 输入: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]

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


【解决方案1】:
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]

【讨论】:

    【解决方案2】:

    考虑这一行:

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

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

    K.extend(L1[i:] + L2[j:])
    

    顺便说一句,我通过使用调试器单步调试您的代码并输入L=[2,1] 发现了这一点。我发现,当我只通过while 循环进行一次迭代时,由于每次循环迭代都添加了一个元素,因此结果中只能有一个元素。如果您还不知道如何使用调试器单步执行代码,那么现在是学习的好时机。

    【讨论】:

    • 与其他答案相比,这种方法的好处是您不必通过大量边界检查使循环内的条件复杂化。
    【解决方案3】:

    在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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-27
      • 2015-09-17
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多