python合并排序问题

nuc*_*uce 5 python sorting algorithm 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
Run Code Online (Sandbox Code Playgroud)

如果有人能够指出什么打破了我当前的合并排序实现,我真的很感激.

Anm*_*ggi 5

代码中有2个错误:

  • if first < last: 应该 if first < last and last-first >= 2:
  • merge_sort(A, middle+1, last) 应该 merge_sort(A, middle, last)

  • 早些时候,中间元素没有包含在两半中的任何一个中.因此,将"中间+ 1"更改为"中间"将其包含在右半部分中. (3认同)
  • `如果第一个<last - 1:`有点短,恕我直言更清楚. (2认同)

Ser*_*sta 5

问题在这里:

    merge_sort(A, first, middle)
    merge_sort(A, middle+1, last) # BEEP
Run Code Online (Sandbox Code Playgroud)

您只应从中间+1开始对第二部分进行排序,而应该从中间开始。实际上,您永远不会在中间对元素进行重新排序。

当然你也不能写

    merge_sort(A, first, middle)
    merge_sort(A, middle, last) # BEEP, BEEP
Run Code Online (Sandbox Code Playgroud)

因为当last = first + 1时,您将获得Middle == first并进行无穷递归(以停止RuntimeError: maximum recursion depth exceeded

因此,方法是:

    merge_sort(A, first, middle)
    if middle > first: merge_sort(A, middle, last)
Run Code Online (Sandbox Code Playgroud)

进行了少许更改之后,您的实现将给出正确的结果。