#ruby #for-loop #while-loop #nested-loops #insertion-sort
Вопрос:
Как упоминалось выше, код мог выполняться, но пропускал обмен номерами в 6-м раунде.
def insertion_sort(list)
num = list.length
for i in (0..(num-2))
p i
if list[i] > list[i 1]
len = (list[0..(i 1)].length)
list2 = list[0..(i 1)]
list = list - list2
count = 0
while count < len
if list2[len-1] < list2[len-2]
list2[len-2],list2[len-1]= list2[len-1],list2[len-2]
else
count =1
len-=1
end
end
list = list2 list
end
p list
end
list
end
insertion_sort([2,5,1,4,8,6,7,3,100,99])
Как показано ниже, номер 3 остановился не в том месте на 6-м раунде.
0
[2, 5, 1, 4, 8, 6, 7, 3, 100, 99]
1
[1, 2, 5, 4, 8, 6, 7, 3, 100, 99]
2
[1, 2, 4, 5, 8, 6, 7, 3, 100, 99]
3
[1, 2, 4, 5, 8, 6, 7, 3, 100, 99]
4
[1, 2, 4, 5, 6, 8, 7, 3, 100, 99]
5
[1, 2, 4, 5, 6, 7, 8, 3, 100, 99]
6
[1, 2, 4, 3, 5, 6, 7, 8, 100, 99]
7
[1, 2, 4, 3, 5, 6, 7, 8, 100, 99]
8
[1, 2, 4, 3, 5, 6, 7, 8, 99, 100]
Может ли кто-нибудь помочь указать, какая часть кода вызывает это? :)))
-Д
Комментарии:
1. Вы использовали отладчик, такой как byebug или pry, и установили точку останова в 6-м раунде, чтобы посмотреть, что происходит?
2. На самом деле я еще никогда не использовал отладчик. Уилл деф займется этим. Спасибо, Макс
3. Код выдает ошибки, когда передается массив
[2,5,1,4,8,6,7,3,100,99, 1]
. В нем есть логическая ошибка. Я бы посоветовал вам написать свой код, следуя псевдокоду алгоритма , который вы можете найти в википедии4. После того, как вы узнаете, в чем проблема, и исправите свой код, я предложил вам опубликовать его на дочернем сайте SO, Code Review . Там вы получите хорошие советы о том, как его улучшить. Ваш код выглядит как прямой порт с процедурного языка, такого как C, и не использует никаких языковых функций Ruby. Первая подсказка-это ваша третья строка,
for i in (0..(num-2))
. Да,for
циклы являются частью языка, но на практике они никогда не используются.5. @сэм, спасибо! немного изучил псевдокод и не смог полностью понять его. я вернусь позже.
Ответ №1:
Что касается ошибки 6-го раунда: 6 [1, 2, 4, 3, 5, 6, 7, 8, 100, 99]
Я узнал, что ошибка произошла из-за настройки «количество Исправив это, я установил «количество
while count <= len
Окончательный код, как показано ниже, может работать плавно.
def insertion_sort(list)
num = list.length
for i in (0..(num-2))
if list[i] > list[i 1] amp;amp; i == 0
list[i], list[i 1] = list[i 1], list[i]
elsif list[i] == list[i 1]
i =1
elsif list[i] > list[i 1] amp;amp; i > 0
len = (list[0..(i 1)].length)
list2 = list[0..(i 1)]
list = list - list2
count = 0
while count <= len
if list2[len-1] < list2[len-2]
list2[len-2],list2[len-1]= list2[len-1],list2[len-2]
elsif list2[len-1] == list2[len-2]
count =1
len-=1
else
count =1
len-=1
end
end
list = list2 list
end
end
list
end
p insertion_sort([2,1,4,8,6,7,3,100,99])
p insertion_sort([136,4180,53,1,22,17])
p insertion_sort([3980,1,20,5,8,10])
И ВСЕ ЖЕ!
Новый вопрос заключается в том, содержал ли массив 2 одинаковых целых числа,
p insertion_sort([3980,1,20,5,8,8,10])
Произойдет ошибка ниже. abc.rb:7:в»>»: сравнение целого числа с нулем не удалось (аргумент) >сообщение об ошибке
Кто-нибудь знает, как это решить?
Комментарии:
1. Пожалуйста, задайте свой «новый» вопрос в отдельном вопросе (поставьте ссылку на этот). Это не только соответствует стандартам этого сайта, но и гораздо более вероятно, что вы действительно получите ответы.
2. @ouflak спасибо за редактирование! и ценю ваши отзывы