2016-06-26 2 views
0

У меня возникло много проблем с написанием алгоритма Quicksort в Ruby. Я иду от C++/Java, так что мой код может быть совершенно неправильно:Проблемы с Quicksort в Ruby

def quicksort(*list) 

    if list.empty? 
     return list 
    end 

    $pivot = list.sample 

    list.delete_at(list.index($pivot)) 

    current_element = list[0] 

    $smaller = Array.new 
    $larger = Array.new 


    list.each do |x| 
     if (list[x] <= $pivot) 
     $smaller << list[x] 
     else 
     $larger << list[x] 
     end 
    end 

    $sorted = Array.new 

    $sorted << self.quicksort(*$smaller) 
    $sorted << pivot 
    $sorted << self.quicksort(*$larger) 

    $sorted.flatten! 

    return *$sorted 
end 

myArray = [5, 4, 3, 2, 1] 
sorted = Array.new(quicksort(myArray)) 

myArray.each do |x| 
print x 
end 

print "\n" 

Это ошибка, что я получаю:

My error

Вы можете не устанавливать массив, равный к функции, которая возвращает массив, как вы могли бы на C++ или Java?

+1

Пожалуйста, добавьте ошибку как текст, а не как изображение – AlBlue

+0

Извините, но вы даже прочитали сообщение об ошибке? Откуда у вас создается впечатление, что сообщение об ошибке имеет какое-то отношение к «установке массива, равного функции, возвращающей массив»? Я думаю, что сообщение об ошибке довольно ясно: вы определили 'quicksort' как метод' private', но вы не называете его 'private'. Вы должны называть его как «закрытый» метод, т. Е. Без явного приемника. –

+0

Несколько соображений: '$ foo' в ruby ​​- это глобальная переменная. Это не похоже, что любая из переменных в вашей функции должна быть глобальной. Фактически, они, вероятно, вызывают проблемы, потому что '$ sorted' переписывается каждый раз, когда функция рекурсивно называется. Когда вы используете оператор splat в 'def quicksort (* list)', вы передаете каждый элемент 'list' как отдельный аргумент, а не передаете весь список. Я не думаю, что это то, что вы хотите. Точно так же просто верните '$ sorted', а не' * $ sorted'. – lwassink

ответ

0

Редактирование кода must have a class to define methods in IRB. Кроме того, я исправил ошибку с отсутствующим долларом до поворота.

class SortingAlgorithms 
    def self.quicksort(*list) 

    if list.empty? 
     return list 
    end 

    $pivot = list.sample 

    list.delete_at(list.index($pivot)) 

    current_element = list[0] 

    $smaller = Array.new 
    $larger = Array.new 


    list.each do |x| 
     if (list[x] <= $pivot) 
     $smaller << list[x] 
     else 
     $larger << list[x] 
     end 
    end 

    $sorted = Array.new 

    $sorted << self.quicksort(*$smaller) 
    $sorted << $pivot 
    $sorted << self.quicksort(*$larger) 

    $sorted.flatten! 

    return *$sorted 
    end 
end 


myArray = [5, 4, 3, 2, 1] 
sorted = Array.new(SortingAlgorithms.quicksort(myArray)) 

myArray.each do |x| 
    print x 
end 

print "\n" 

Но, красивый рубиновый путь, предоставленный в другом thread.

Смежные вопросы