首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python合并排序问题

python合并排序问题
EN

Stack Overflow用户
提问于 2016-01-26 12:29:48
回答 2查看 624关注 0票数 5

不知道我在python中合并排序的实现出了什么问题。

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-26 13:25:05

问题在于:

代码语言:javascript
复制
    merge_sort(A, first, middle)
    merge_sort(A, middle+1, last) # BEEP

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

当然,你也不能写

代码语言:javascript
复制
    merge_sort(A, first, middle)
    merge_sort(A, middle, last) # BEEP, BEEP

因为当last = first + 1时,您首先得到中间的==,然后跳入一个没完没了的递归(由一个RuntimeError: maximum recursion depth exceeded停止)

所以要走的路是:

代码语言:javascript
复制
    merge_sort(A, first, middle)
    if middle > first: merge_sort(A, middle, last)

在进行了这个小小的更改之后,您的实现会给出正确的结果。

票数 5
EN

Stack Overflow用户

发布于 2016-01-26 13:05:55

代码中有两个错误:

  • if first < last:应该是if first < last and last-first >= 2:
  • merge_sort(A, middle+1, last)应该是merge_sort(A, middle, last)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35013892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档