使用Merge Sort堆栈到深

时间:2017-03-02 08:21:10

标签: ruby

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

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

2 个答案:

答案 0 :(得分:2)

这里是朝着正确方向迈出的一步,它在如何更宽容的情况下更像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它应该是。从那里开始,一切都变得疯狂,因为这样做的数学错误,并且无缘无故地自称。

答案 1 :(得分:0)

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

  

j / 2 + 1

应该是

  

(i + j)/ 2 + 1

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