我试图在Ruby中编写quicksort,但我收到的错误是:
qsort.rb:43:in `<': comparison of Fixnum with nil failed (ArgumentError)
from qsort.rb:43:in `block in dist'
from qsort.rb:42:in `each'
from qsort.rb:42:in `dist'
from qsort.rb:32:in `sort'
from qsort.rb:34:in `sort'
from qsort.rb:53:in `<main>'
这是我的代码:
#!usr/bin/ruby
class QArray
@data = []
@pvalue
@less
@more
def initialize(arr = [])
@data = arr
@pvalue = @data[0] unless @data.empty?
end
#these methods are so I can treat a QArray like a regular array
def push(value)
@data.push value
end
def empty?
@data.empty?
end
def single?
return @data.size == 1
end
def print
puts @data
end
def sort
puts "starting the sort with an array of #{@data}"
dist unless @data.empty?
@less.sort unless @less.empty? || @less.single?
@more.sort unless @more.empty? || @more.single?
@data = @less + @more #combine the two arrays again
end
def dist
#distributes values into subarrays
@less = QArray.new
@more = QArray.new
@data.each {|e|
if (e < @pvalue)
@less.push e
else #includes both equals and greater than
@more.push e
end
}
end
end
arr = QArray.new ([1,5,6,7,9,23,43,2,4,6])
arr.sort
arr.print
我猜这与块中的n为零有关。但是,这不应该发生,因为我在调用dist之前检查数组是否为空。
为什么我会收到此错误,我该怎么做才能修复它?
答案 0 :(得分:2)
您在QArray
中创建了新的dist
。
您在@pvalue
创建时初始化QArray
,但在dist
创建时,它们会为空。
在dist
中,您尝试使用@pvalue
,这是nil,因为您创建的数组为空,只有然后为其添加值,从不更新未初始化的{ {1}}值。
不相关,但@pvalue
顶部的那些类实例变量是什么?!