Fixnum being treated as Array in Ruby

259 Views Asked by At

I am new to Ruby and I am trying out the merge sort algorithm as given in Wikipedia

I am getting "comparison of Fixnum with Array failed (ArgumentError)" failed error when comparing the first elements of the left and right array in the merge method. What could be the reason and how do I resolve this problem? Thanks :)

def mergeSort(array)
    if array.length == 1
        return array
    end

    middle = array.length/2 - 1
    left = array[0..middle]
    right = array[middle+1..array.length-1]

    left = mergeSort(left)
    right = mergeSort(right)
    merge(left,right)
end


def merge(left,right)
    result = []
    while left.length > 0 || right.length > 0
        if left.length > 0 && right.length > 0
            one = left[0]
            two = right[0]
            puts ("one's class is #{one.class} two's class is #{two.class} two is #{two}")
            if one <= two
                result << left.shift
            else
                result << right.shift
            end
        elsif left.length > 0
            result.push(left)
            left = []
        else
            result.push(right)
            right = []
        end 
    end
    puts "result is #{result}"
    result
end
1

There are 1 best solutions below

4
On BEST ANSWER

The error is on these lines:

    elsif left.length > 0
        result.push(left)
        left = []
    else
        result.push(right)
        right = []
    end

A simple example should indicate why:

irb(main):067:0> a=[1,2]
=> [1, 2]
irb(main):068:0> b=[3,4]
=> [3, 4]
irb(main):069:0> a.push(b)
=> [1, 2, [3, 4]]

Instead of push(), try concat().