Ruby" ArgumentError:Fixnum与Array的比较失败"

时间:2014-07-08 15:29:55

标签: ruby recursion mergesort

我试图实现一个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]

1 个答案:

答案 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]比较数组元素时,arr1arr2的元素不一定在同一嵌套级别(即,它们可能是数组,也可能不是数组)。这会导致错误。

如果您将上面部分中的<<更改为concat,那么它将会有效。