我正在尝试使用递归来实现自己的合并排序。
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
答案 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
应该是
tadman在他的重新版本中得到了正确的公式(i + j)/ 2 + 1