比较quicksort中的nil错误

时间:2015-02-27 18:15:41

标签: ruby quicksort

我试图在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之前检查数组是否为空。

为什么我会收到此错误,我该怎么做才能修复它?

1 个答案:

答案 0 :(得分:2)

您在QArray中创建了新的dist

您在@pvalue创建时初始化QArray,但在dist创建时,它们会为空。

dist中,您尝试使用@pvalue,这是nil,因为您创建的数组为空,只有然后为其添加值,从不更新未初始化的{ {1}}值。

不相关,但@pvalue顶部的那些类实例变量是什么?!