【问题标题】:Stack to deep using Merge Sort使用合并排序堆叠到深
【发布时间】:2017-07-21 20:48:01
【问题描述】:

我正在尝试使用递归自己实现合并排序。

def merge_sort(a,i,j)
  if i < j 
    merge_sort(a,i,j/2)
    merge_sort(a,j/2+1,j)
    merge(a,i,j/2,j/2+1,j)
  end
end

def merge(a,i,j,k,l)
  # No implementation yet
end

问题是我的实现导致堆栈过深。对于这么小的数组,我不应该收到此错误消息。我要排序的数组只有五个元素。

b = [5,4,3,2,1]
p merge_sort(b,0,b.size - 1) # => results in 'stack to deep' message

【问题讨论】:

  • 第一步是调试。 p [ a, i, j ] 作为第一行可能会非常很有启发性。我的钱出现了一个错误。

标签: ruby


【解决方案1】:

这是朝着正确方向迈出的一步,它在宽容度方面更像 Ruby,另外还有实际名称而不是数学速记:

def merge_sort(arr,from = nil,to = nil)
  from ||= 0
  to ||= arr.length

  if (from < to)
    part = from + (to - from) / 2

    merge_sort(arr, from, part)
    merge_sort(arr, part + 1, to)

    merge(arr, from,part, part+1, to)
  end
end

def merge(a,from,j,k,l)
  # No implementation yet
end

b = [5,4,3,2,1]
merge_sort(b)

错误来自未正确定义分区点。在长度为 5 的数组的原始代码中,切割点为 2,当进一步划分时,切割点为 2/1 或 1,而不是应有的 2+(5-3)/2 或 3。从那里开始,一切都变得疯狂了,因为它做错了数学并且一直无缘无故地调用自己。

【讨论】:

  • # No frommplementatfromon yet 有人尝试用 Regexp 解析 Ruby 吗? ;-)
  • 你有什么理由不使用def merge_sort(arr, from = 0, to = arr.length)
  • @JörgWMittag 这只是个人对过于复杂的默认设置的厌恶。这当然是一种有效的方法。
  • 谢谢,问题是我的中点公式错误,导致递归陷入无限循环。
【解决方案2】:

我的问题是我的中点公式没有将递归抛入无限循环,直到堆栈溢出。而不是

j / 2 + 1

应该是的

(i+j) / 2 + 1

tadman 在他的重新版本控制中得到了正确的公式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    相关资源
    最近更新 更多