Метод сортировки вставки с Ruby странно пропустил один цикл замены, не могу понять, почему

#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 спасибо за редактирование! и ценю ваши отзывы