Fixnum рассматривается как массив в Ruby - PullRequest
4 голосов
/ 13 ноября 2011

Я новичок в Ruby и пробую алгоритм сортировки слиянием , как указано в Википедии

Я получаю сообщение об ошибке «Сравнение Fixnum с Array failed (ArgumentError)» при сравнении первых элементов левого и правого массива в методе слияния. В чем может быть причина и как мне решить эту проблему? Спасибо :)

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 Ответ

5 голосов
/ 13 ноября 2011

Ошибка в следующих строках:

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

Простой пример должен указать, почему:

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]]

Вместо push(), попробуйте concat().

...