Сравнение Integer с nil не удалось в алгоритме пузырьковой сортировки - PullRequest
0 голосов
/ 28 апреля 2019

Я создаю алгоритм пузырьковой сортировки.Почему я получаю сообщение об ошибке сравнения Integer с nil fail (ArgumentError)?

def bubble_sort(arr)

  arr.each_with_index do |i, j|    
    print arr[j]
    print arr[j+1]

    if arr[j] > arr[j+1]
      print "swap"
    end 
  end

  print arr

end

bubble_sort([4,3,78,2,0,2])

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Сначала вы просите скрипт прочитать индекс J+1, когда последний индекс может быть j. Или, другими словами, вы просите получить доступ к значению nil в массиве. Вы должны убедиться, что не пытаетесь получить доступ к элементу n+1 в вашем массиве. Просто проверьте и вырвитесь из цикла, если достигнете последнего элемента:

break if arr.size-1 == j #j is the last index now 

Во-вторых, вы ничего не делаете в своем коде, а печатаете. Вы можете сделать что-то

temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
0 голосов
/ 12 июля 2019

Элемент массива с индексом j+1 не может быть найден при итерации по массиву с .each_with_index. j+1 возвращает nil, а затем вы пытаетесь сравнить его с arr[j], что вызывает ошибку аргумента.

.each_with_index здесь бесполезен, так как вы используете только индексы. И вам нужно снова запустить проверку, если найдены несортированные значения.

Я предлагаю использовать цикл от 0 до последнего возможного значения индекса. Примерно так:

def bubble_sort(arr)
  index = 0

  while index < arr.size - 1 do
    if arr[index] > arr[index+1]
      arr[index], arr[index+1] = arr[index+1], arr[index]
      index = 0
    else
      index += 1
    end
  end

  print arr
end

bubble_sort([4,3,78,2,0,2]) # => [0, 2, 2, 3, 4, 78]
...