【问题标题】:The use of recursion in merge sort for pythonpython合并排序中递归的使用
【发布时间】:2017-01-11 19:33:37
【问题描述】:

我正在学习python中的归并排序,我对以下程序的实现有点困惑。据我了解,mergeSort ([3,1], compare)在实现的时候,会分裂成mergeSort([3], compare)和mergeSort([1], compare)。然后应该调用merge([3],[1], compare),所以print语句应该是left = [1,3],但程序实际上打印出left = [3,1],其他print语句也是如此,为什么?非常感谢。

def merge(left, right, compare):
    """Assumes left and right are sorted lists and compare defines an ordering
       on the elements.
       Returns a new sorted (by compare list containing the same elements as
       (left + right) would contain."""
    result = []
    i,j = 0, 0
    while i < len(left) and j < len(right):
        if compare(left[i], right[j]):
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    while (i < len(left)):
        result.append(left[i])
        i += 1
    while (j < len(right)):
        result.append(right[j])
        j += 1
    return result

import operator

def mergeSort(L, compare = operator.lt):
    """Assumes L is a list, compare defines an ordering on elements of L
       Returns a new sorted list containing the same elements as L"""
    if len(L) < 2:
        return L[:]
    else:
        middle = len(L)//2
        print "middle =", middle
        left = mergeSort(L[:middle], compare)
        print "left = ", L[:middle]
        right = mergeSort(L[middle:], compare)
        print "right = ", L[middle:]
        return merge(left, right, compare)

>>> L = [3,1,2,5,4,9,6,7,8]
>>> mergeSort(L, compare = operator.lt)
middle = 4
middle = 2
middle = 1
left =  [3]
right =  [1]
left =  [3, 1]
middle = 1
left =  [2]
right =  [5]
right =  [2, 5]
left =  [3, 1, 2, 5]
middle = 2
middle = 1
left =  [4]
right =  [9]
left =  [4, 9]
middle = 1
left =  [6]
middle = 1
left =  [7]
right =  [8]
right =  [7, 8]
right =  [6, 7, 8]
right =  [4, 9, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

【问题讨论】:

  • 非常感谢,您说的完全正确。排序根本不会影响列表 L,它会创建一个新列表,而我所做的只是从旧的 L 列表中打印。我说的对吗?

标签: python recursion mergesort


【解决方案1】:

这就是问题所在:

    print "left = ", L[:middle] # content of L before sorting

将此行和其他类似的print 语句替换为:

    print "left = ", left # actual result of mergeSort

【讨论】:

  • 哦,是的,这可能是了解正在发生的事情的更好方法。
【解决方案2】:
left = mergeSort(L[:middle], compare)
print "left = ", left
right = mergeSort(L[middle:], compare)
print "right = ", right

这应该可行。

【讨论】:

    【解决方案3】:

    此代码打印L,因为它被递归拆分。它实际上并没有打印任何合并的结果。换行可以看到每次合并的结果

    return merge(left, right, compare)
    

    到

    merged = merge(left, right, compare)
    print "merged = ", merged
    return merged
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 2015-09-20
      • 2021-11-06
      • 2019-01-22
      相关资源
      最近更新 更多