【发布时间】:2014-08-29 10:14:39
【问题描述】:
我正在尝试实现一个 Ruby 合并排序算法,在我看来,该程序应该可以工作。但是,我收到标题中列出的错误,我不太清楚为什么。任何帮助将不胜感激
完整代码:
def merge_sort(arr)
return arr if arr.length == 1
mid = arr.length/2
left = merge_sort(arr[0..mid-1])
right = merge_sort(arr[mid..-1])
merge(left,right)
end
def merge(arr1,arr2,merged=[])
i=0 #arr1 initialize
j=0 #arr2 initialize
while i < arr1.length || j < arr2.length
if i < arr1.length && j<arr2.length
if arr1[i] <= arr2[j]
merged << arr1[i]
i+=1
else
merged << arr2[j]
j+=1
end
elsif i<arr1.length
merged << arr1[i..-1]
i=arr1.length
elsif j<arr2.length
merged << arr2[j..-1]
j=arr2.length
end
end
merged
end
array = [10,9,8,7,6,5,4,3,2,1]
p merge_sort(array)
错误:
$ ruby mergeSort.rb
mergeSort.rb:15:in `<=': comparison of Fixnum with Array failed (ArgumentError)
from mergeSort.rb:15:in `merge'
from mergeSort.rb:6:in `merge_sort'
from mergeSort.rb:5:in `merge_sort'
from mergeSort.rb:4:in `merge_sort'
from mergeSort.rb:36:in `<main>'
注意:这里是第 15 行
如果 arr1[i]
【问题讨论】:
-
未来值得指出的是,鉴于 X 行出现错误,您应该从在 X-1 行打印变量开始。例如,在第 15 行之前添加
p arr1和p arr2。这会在错误之前向您显示[8]和[6, [7]],这样会更有意义。 永远不要低估在调试期间打印变量的能力。 :-) -
tt,当我读到“……在我看来,该程序应该可以工作”时,我笑了。我相信这里的每个人都熟悉这种技术。
-
@DreadPirateShawn 这是一个很好的建议。从现在开始,我肯定会合并它。谢谢!