0

我是 Ruby 新手,对排序方法很困惑

例如:

person.sort{|x, y| x.age<=> y.age}

我知道如果我将其更改为y.age<=> x.age,它将反转排序顺序。

我读了另一个问题,他们都只说,x并且是算法y选择的数组中的两个元素。sort

x总是较小的对象吗?我的意思是,如果我像第一种方式那样写,它总是从最年轻到最年长吗?

谢谢

4

2 回答 2

2

您可以通过以下方式自己回答这个问题,用一种归约x 的形式:如果总是较小的对象怎么办?如果是这样,那么您就不必费心将其与 进行比较,对y吗?你可以这样写:

person.sort { |x, y| 1 }

或者也许我把它倒过来了,你可以这样写:

person.sort { |x, y| -1 }

但不管怎样,这有点荒谬,不是吗?当然,如果你尝试它,它不会起作用。

所以这告诉我们,在这个排序块的主体中​​,我们不知道是否xy较小的对象。事实上,x并且y可以是任意两个person数组中的任意元素。这就是我们必须写出比较的全部原因。

这有助于澄清它,还是我误解了你的问题?

于 2013-03-23T06:54:12.570 回答
2

这是对正在发生的事情的简化,而不是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]

如您所见,比较算法被多次调用。xyin|x, y|是传递给比较方法的数组元素的占位符。

于 2013-03-23T07:10:35.440 回答