理解Ruby类:“;未定义的方法`<';对于true:TrueClass“;

理解Ruby类:“;未定义的方法`<';对于true:TrueClass“;,ruby,methods,quicksort,Ruby,Methods,Quicksort,我正在关注Coursera上的一个课程,我正在尝试用Ruby实现快速排序算法。我对OOP的语言和概念非常陌生 我创建了两个函数:一个是quickSort函数,它调用分区例程(根据pivot(数组的第一个元素)将数组拆分为两个子数组) 最后,我将把这两个方法放在一个类数组下,但现在我认为这是可以的 我尝试在数组(a=[5,4,3,2,1])上运行此操作,但遇到以下错误: A2.rb:16:in `partition': undefined method `<' for true:TrueCl

我正在关注Coursera上的一个课程,我正在尝试用Ruby实现快速排序算法。我对OOP的语言和概念非常陌生

我创建了两个函数:一个是quickSort函数,它调用分区例程(根据pivot(数组的第一个元素)将数组拆分为两个子数组)

最后,我将把这两个方法放在一个类数组下,但现在我认为这是可以的

我尝试在数组(a=[5,4,3,2,1])上运行此操作,但遇到以下错误:

A2.rb:16:in `partition': undefined method `<' for true:TrueClass (NoMethodError)
    from A2.rb:15:in `each'
    from A2.rb:15:in `partition'
    from A2.rb:33:in `quickSort'
A2.rb:16:in'partition':未定义的方法`不能执行此操作:

left_idx < j < right_idx and left_idx < i < right_idx
left_idx
您需要建立条件:

((j > left_idx) && (j < left_idx)) && (etc)
((j>left_idx)和&(j
左\u idx
你不能这样做

左_idx 然后表达式变为true
将表达式更改为if left_idx此行存在问题:

if (left_idx < j < right_idx and left_idx < i < right_idx)
(left_idx < j < right_idx and left_idx < i < right_idx)
if(left_idx
这是有效的数学,但无效的Ruby(在大多数其他编程语言中也是无效的)。你想要的是:

if (left_idx < j and j < right_idx and left_idx < i and i < right_idx)
if(left_idx

发生的事情是Ruby解释“问题是这一行:

if (left_idx < j < right_idx and left_idx < i < right_idx)
(left_idx < j < right_idx and left_idx < i < right_idx)

编写快速排序的一种更为惯用的方法是

def quicksort(arr)
   pivot, *rest = arr
   left,right = rest.partition{|v| v<pivot}.map{|a| if !a.empty? then quicksort(a) else a end}
   left.push(pivot) + right
end
def快速排序(arr)
枢轴,*rest=arr

左,右=静止。分区{v|vmaybe
j.between?(左idx+1,右idx-1)和&i.between?(左idx+1,右idx-1)
((左idx-1)…右idx)。包括?(j)和((左idx-1)…右idx)。包括?(i)
@IsmaelAbreu和其他答案一样——是的,我看到了它们。我觉得它们没有多少可读性,如果有的话,但是YMMV。是的,我认为我可以将两者结合起来。令人困惑的部分是试图理解错误。这意味着有一个未定义的方法“@Sammyley”是什么意思?这意味着你正在尝试应用
明白了。我希望我能与你合作将两个条件语句组合在一起,出于某种原因,我认为这是可能的。我忘了从哪里学来这个语法(可能是在MATLAB中)。
left_idx < j && j < right_idx #...
(left_idx..right_idx).include? j && (left_idx..right_idx).include? i
([i,j].all? {|v| (left_idx..right_idx).include? v})
def quicksort(arr)
   pivot, *rest = arr
   left,right = rest.partition{|v| v<pivot}.map{|a| if !a.empty? then quicksort(a) else a end}
   left.push(pivot) + right
end