Проблема с вашим текущим кодом:
arr[i] = arr[i + 1]
arr[i + 1] = arr[i]
Где вы установите arr[i]
равным arr[i + 1]
, затем измените содержимое arr[i + 1]
на arr[i]
(которое установлено на arr[i + 1]
).Это устанавливает оба элемента на содержание arr[i + 1]
.Вы можете использовать временную переменную для хранения предыдущего значения arr[i]
.
tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
Более чистый способ сделать это - использовать множественное присваивание .
arr[i], arr[i + 1] = arr[i + 1], arr[i]
Что устраняет необходимость во временной переменной.
Получив вдохновение из ответов Cary Swoveland и iGian .Вот еще один переработанный способ поиска индекса и обмена значениями.
arr = [5, 22, 29, 39, 19, 51, 78, 96, 84]
i = arr.each_cons(2).find_index { |a, b| a > b }
arr[i, 2] = arr[i, 2].reverse if i
arr #=> [5, 22, 29, 19, 39, 51, 78, 96, 84]