У меня возникло много проблем с написанием алгоритма 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"
Это ошибка, что я получаю:
Вы можете не устанавливать массив, равный к функции, которая возвращает массив, как вы могли бы на C++ или Java?
Пожалуйста, добавьте ошибку как текст, а не как изображение – AlBlue
Извините, но вы даже прочитали сообщение об ошибке? Откуда у вас создается впечатление, что сообщение об ошибке имеет какое-то отношение к «установке массива, равного функции, возвращающей массив»? Я думаю, что сообщение об ошибке довольно ясно: вы определили 'quicksort' как метод' private', но вы не называете его 'private'. Вы должны называть его как «закрытый» метод, т. Е. Без явного приемника. –
Несколько соображений: '$ foo' в ruby - это глобальная переменная. Это не похоже, что любая из переменных в вашей функции должна быть глобальной. Фактически, они, вероятно, вызывают проблемы, потому что '$ sorted' переписывается каждый раз, когда функция рекурсивно называется. Когда вы используете оператор splat в 'def quicksort (* list)', вы передаете каждый элемент 'list' как отдельный аргумент, а не передаете весь список. Я не думаю, что это то, что вы хотите. Точно так же просто верните '$ sorted', а не' * $ sorted'. – lwassink