我试图实现一个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]&lt; = arr2 [j]
答案 0 :(得分:4)
问题在于您通过调用
中的<<
将数组推送到数组中
elsif i<arr1.length
merged << arr1[i..-1]
i=arr1.length
elsif j<arr2.length
merged << arr2[j..-1]
j=arr2.length
end
并创建不需要的嵌套数组。当您按arr1[i] <= arr2[j]
比较数组元素时,arr1
和arr2
的元素不一定在同一嵌套级别(即,它们可能是数组,也可能不是数组)。这会导致错误。
如果您将上面部分中的<<
更改为concat
,那么它将会有效。