python合并排序问题

标签 python algorithm sorting mergesort clrs

<分区>

不确定我在 python 中实现合并排序哪里出错了。

import sys

sequence = [6, 5, 4, 3, 2, 1]

def merge_sort(A, first, last):
    if first < last:
        middle = (first + last) / 2
        merge_sort(A, first, middle)
        merge_sort(A, middle+1, last)
        merge(A, first, middle, last)

def merge(A, first, middle, last):
    L = A[first:middle]
    R = A[middle:last]

    L.append(sys.maxint)
    R.append(sys.maxint)

    i = 0
    j = 0
    for k in xrange(first, last):
        if L[i] <= R[j]:
            A[k] = L[i]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1

merge_sort(sequence, 0, len(sequence))
print sequence

如果有人能指出是什么破坏了我当前的合并排序实现,我将不胜感激。

最佳答案

问题出在这里:

    merge_sort(A, first, middle)
    merge_sort(A, middle+1, last) # BEEP

当你应该从中间开始时,你只从中间 + 1 排序第二部分。事实上,您永远不会对中间的元素重新排序。

当然你也不能写

    merge_sort(A, first, middle)
    merge_sort(A, middle, last) # BEEP, BEEP

因为当 last = first + 1 时,您先得到 middle == first 并陷入无休止的递归(因 RuntimeError: maximum recursion depth exceeded 而停止)

所以要走的路是:

    merge_sort(A, first, middle)
    if middle > first: merge_sort(A, middle, last)

在那个小改动之后,您的实现给出了正确的结果。

关于python合并排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35013892/

相关文章:

相当于 Python 功能的 Java -> set(string)

python - 如何在 Shapely 中从多边形中提取多边形?

algorithm - 分而治之算法对列表进行排序,其中每个元素距离其排序位置为 root(n)

algorithm - 将成对距离映射到二维空间的领域或算法类的名称是什么?

PHP关联数组排序

sorting - DefaultGroovyMethod排序可导致版本更改和数据库更新

python - 如何确定描述符的类别?

Python 将大写和小写名称的文件视为相同

R:多边形组合算法

python - 为什么这个用于对异构序列进行排序的关键类表现得很奇怪?