0

我正在创建一个冒泡排序算法。为什么我会收到 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])
4

2 回答 2

1

首先,您要求脚本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
于 2019-04-28T09:24:27.613 回答
0

j+1当您使用 迭代数组时,找不到具有索引的数组元素.each_with_indexj+1返回nil,然后您尝试将其与arr[j]导致 Argument 错误的原因进行比较。

.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]
于 2019-07-12T14:30:46.897 回答