下面是我在 ruby 中的快速排序实现(使用第一个元素作为枢轴)。但是有一个错误我不知道为什么
def quicksort(items)
return items if items.nil? or items.length <= 1
first=items[0]
left,right=parti(items,0,items.length)
quicksort(left) + [first] + quicksort(right)
end
def parti(s,l,r)
p=s[l]
i=l+1
(l+1..r).each do |x|
if s[x] < p
s[x],s[i] = s[i],s[x]
i+=1
end
end
s[l],s[i-1] = s[i-1],s[l]
return [s[0..i-2],s[i..r]]
end
错误:
putarray.rb:38:in `block in parti': undefined method `<' for nil:NilClass (NoM
hodError)
from inputarray.rb:37:in `each'
from inputarray.rb:37:in `parti'
from inputarray.rb:22:in `quicksort'
from inputarray.rb:47:in `<main>'
它说
if s[x] < p
s[x] 是 NilClass。
更新:事实证明
left,right=parti(items,0,items.length) should be
left,right=parti(items,0,items.length-1)
但是在这个改变之后,一个错误
inputarray.rb:37: stack level too deep (SystemStackError)
指向
(l+1..r).each do |x|
在互联网上没有找到任何好的解释。