我是 Ruby 新手,对排序方法很困惑
例如:
person.sort{|x, y| x.age<=> y.age}
我知道如果我将其更改为y.age<=> x.age
,它将反转排序顺序。
我读了另一个问题,他们都只说,x
并且是算法y
选择的数组中的两个元素。sort
但x
总是较小的对象吗?我的意思是,如果我像第一种方式那样写,它总是从最年轻到最年长吗?
谢谢
您可以通过以下方式自己回答这个问题,用一种归约x
法的形式:如果总是较小的对象怎么办?如果是这样,那么您就不必费心将其与 进行比较,对y
吗?你可以这样写:
person.sort { |x, y| 1 }
或者也许我把它倒过来了,你可以这样写:
person.sort { |x, y| -1 }
但不管怎样,这有点荒谬,不是吗?当然,如果你尝试它,它不会起作用。
所以这告诉我们,在这个排序块的主体中,我们不知道是否x
是y
较小的对象。事实上,x
并且y
可以是任意两个person
数组中的任意元素。这就是我们必须写出比较的全部原因。
这有助于澄清它,还是我误解了你的问题?
这是对正在发生的事情的简化,而不是Ruby 使用的排序算法(希望如此),但它可能有助于理解正在发生的事情。
假设您有一系列想要排序的年龄:
[15, 25, 12]
现在排序算法开始遍历数组以确定正确的排序。首先它选择前两个元素并比较它们:
|15, 25| 15 <=> 25
结果是 -1,所以现在它知道 15 应该排在 25 之前。
接下来需要 25 和 12。
|25, 12| 25 <=> 12
结果是 1。12 也应该排在 25 之前。
现在我们知道 25 应该排在每个其他元素之后。我们只需要知道 15 到 12 之间的顺序。
|15, 12| 15 <=> 12
结果是 1,所以 12 应该排在 15 之前。现在知道最终的排序:
[12, 15, 25]
如您所见,比较算法被多次调用。x
和y
in|x, y|
是传递给比较方法的数组元素的占位符。