【问题标题】:MergeSort recursive implementationMergeSort 递归实现
【发布时间】:2016-04-18 00:58:20
【问题描述】:

我今天刚刚学习了 Python,并且正在尝试递归地实现 Mergesort……我绝对无法弄清楚我做错了什么。有人可以帮忙吗?

def mergesort(A):

    if len(A) < 2:
        return A
    middle = len(A) // 2
    L = mergesort(A[:middle])
    R = mergesort(A[middle:])
    return merge(L, R)

# Merge - combine part of mergesort

def merge(Lsort, Rsort):


sort = [None] * (len(Lsort + Rsort))


i = 0
j = 0
k = 0 
while (len(Lsort) <= len(sort)) or (len(Rsort) <= len(sort)):
    if Lsort[i] < Rsort[j]:
        sort[k] = Lsort[i]
        i += 1
    else:
        sort[k] = Rsort[j]
        j += 1
    k += 1
return sort

【问题讨论】:

    标签: python list recursion merge mergesort


    【解决方案1】:

    您的合并功能是问题所在,应该更像:

    def merge(Lsort, Rsort):                                                                                                                                                                                    
        sort = []                                                                                                                                                                                               
    
        i = 0                                                                                                                                                                                                   
        j = 0                                                                                                                                                                                                   
        while (len(Lsort) > i) & (len(Rsort) > j):                                                                                                                                                              
            if Lsort[i] < Rsort[j]:                                                                                                                                                                             
                sort.append(Lsort[i])                                                                                                                                                                           
                i += 1                                                                                                                                                                                          
            else:                                                                                                                                                                                               
                sort.append(Rsort[j])                                                                                                                                                                           
                j += 1                                                                                                                                                                                          
    
        if len(Lsort) > 0:                                                                                                                                                                                      
            sort += Lsort[i:]                                                                                                                                                                                   
    
        if len(Rsort) > 0:                                                                                                                                                                                      
            sort += Rsort[j:]                                                                                                                                                                                   
    
        return sort
    

    一般来说,您不需要为排序分配空间,只需随时追加到一个空列表即可。对于 while 逻辑,您需要确保不超出 Lsort 和 Rsort 数组的范围。确保您的索引小于数组长度。

    当任一数组用尽时,您可以将剩余的数组项连接到您的排序列表。

    【讨论】:

      【解决方案2】:

      这与 Python 无关,而与逻辑有关。

      while 表达式更改为

      while k < len(sort):
      

      if 表达式为

      if (j >= len(Rsort)) or (i < len(Lsort) and Lsort[i] < Rsort[j]):
      

      【讨论】:

      【解决方案3】:

      这里是http://interactivepython.org/runestone/static/pythonds/SortSearch/TheMergeSort.html提供的Python版本

      (请注意,下面我将应用程序流程的图像粘贴到我制作的示例列表中,以帮助我理解递归流程(因为我是 nube)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多