与快速排序中的零错误进行比较

Comparing with nil error in quicksort

我试图在 Ruby 中编写快速排序,但我收到一条错误消息:

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

我猜这与块中的 e 为 nil 有关。然而,这不应该发生,因为我在调用 dist 之前检查数组是否为空。

为什么会出现此错误,我该如何解决?

您在 dist 中创建了新的 QArray

您在 QArray 创建时初始化 @pvalue,但在 dist 中创建时它们是空的。

dist 中你然后尝试使用 @pvalue,它是 nil,因为你创建的数组是空的并且只有 然后 向它添加值,从不更新未初始化的 @pvalue 值。

无关,但是 QArray 顶部的那些 class 实例变量是做什么用的?!