冒泡排序算法中 Integer 与 nil 的比较失败

Comparison of Integer with nil failed in bubble sort algorithm

我正在创建冒泡排序算法。为什么我得到 Integer 与 nil 比较失败的错误消息 (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])

首先,当最后一个索引可能是 j 时,您要求脚本读取 J+1 索引。或者换句话说,您要求访问数组中的 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

当您使用 .each_with_index 遍历数组时,无法找到索引为 j+1 的数组元素。 j+1 returns 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]