气泡排序算法中整数与nil的比较失败

时间:2019-04-28 04:16:06

标签: ruby comparison argument-error

我正在创建气泡排序算法。为什么我得到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])

2 个答案:

答案 0 :(得分:0)

首先,当最后一个索引为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

答案 1 :(得分:0)

当您使用j+1遍历数组时,找不到具有索引.each_with_index

Array元素。 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]