2012-06-19 3 views
1

Я пытаюсь использовать метод сортировки пузырьков для сортировки массива из трех чисел. Код, который я использую, приведен ниже.Сортировка массива в Ruby без использования метода сортировки

def my_sort(list) 
    return list if list.size <= 1 

    swapped = false 

    while !swapped 
    swapped = false 

    0.upto(list.size-2) do |i| 
     if list[i] > list[i+1] 
     list[i], list[i+1] = list[i+1], list[i] 
     swapped = true 
     end 
    end 

    list 
    end 

my_sort([3,1,2]) 

Вот сообщение об ошибке я получаю:

Syntax error, unexpected $end, expecting keyword_end 

мне было просто интересно, какой конец не должен быть включен?

+4

Отступ код правильно, и вы увидите, что недостающее 'end' сразу. – tokland

+0

Возможный дубликат [Как вы сортируете, не используя метод сортировки?] (Http://stackoverflow.com/questions/11057381/how-do-you-sort-without-using-the-sort-method) –

ответ

5

Вам не хватает end после swapped = true. Было бы лучше полностью отделить ваш код и точно, чтобы избежать такого рода проблем:

def my_sort(list) 
    return list if list.size <= 1 

    swapped = false 
    while !swapped 
    swapped = false 
    0.upto(list.size-2) do |i| 
     if list[i] > list[i+1] 
     list[i], list[i+1] = list[i+1], list[i] 
     swapped = true 
     end 
    end 
    end 

    list 
end 
3

Вы упускаете в end

if list[i] > list[i+1] 
    list[i], list[i+1] = list[i+1], list[i] 
    swapped = true 
    end # <-------------------------------------------------------- 

Edit: В другой ответ упоминает, отступы код, чтобы сделать эти ошибки более заметными.

1

Ваш код работает для этого конкретного массива. Потому что ваша петля ищет, если следующий элемент выше, а затем проведите пальцем по экрану. Но как насчет большего количества элементов в массиве? Это рекурсивное решение для всех случаев.

def my_sort(list, new_array = nil) 

    return new_array if list.size <= 0 
    if new_array == nil 
    new_array = [] 
    end 
    min = list.min 
    new_array << min 
    list.delete(min) 

    my_sort(list, new_array) 

end 

puts my_sort([3, 1, 2, 20, 11, 14, 3, 6, 8, 5]) 
-1
#Using bubble sort algorithm in ruby 

a = [1,5,7,2,3,50,78,34,89] 

a.size.times.each do |t| 
i=0 
a.each do |b| 
    if b > a[i+1] 
    a[i],a[i+1] = a[i+1],a[i] 
    end 
    i+=1 if i < a.size-2 
end 
end 
print a 
#output: [1, 2, 3, 5, 7, 34, 50, 78, 89] 
+0

Code- только ответы обескуражены, потому что они не объясняют, как они решают проблему. Пожалуйста, обновите свой ответ, чтобы объяснить, как это улучшается на других принятых и поддержанных ответах, которые уже заданы этим вопросом. Кроме того, этот вопрос составляет 5 лет, ваши усилия будут более оценены пользователями, у которых есть недавние неотвеченные вопросы. Пожалуйста, просмотрите [Как написать хороший ответ] (https://stackoverflow.com/help/how-to-answer). – FluffyKitten

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