5

不知道我在 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

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

4

2 回答 2

5

问题在这里:

    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 并陷入无休止的递归(由 a 停止RuntimeError: maximum recursion depth exceeded

所以要走的路是:

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

在那一点点改变之后,你的实现给出了正确的结果。

于 2016-01-26T13:25:05.823 回答
5

代码中有2个错误:

  • if first < last:应该if first < last and last-first >= 2:
  • merge_sort(A, middle+1, last)应该merge_sort(A, middle, last)
于 2016-01-26T13:05:55.927 回答