排序方法如何工作?需要了解源代码

时间:2014-09-03 23:53:07

标签: ruby sorting

我试图理解使用的sort方法:

(1..10).sort {|a,b| b <=> a}   #=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

查看its source code

static VALUE
enum_sort(VALUE obj)
{
    return rb_ary_sort(enum_to_a(0, 0, obj));
}

但是,我无法理解排序是如何运作的。请帮我理解排序方式。

3 个答案:

答案 0 :(得分:2)

每当我遇到这样的问题时,我发现在Rubinius中查看相同的方法定义会很有帮助。 Rubinius是一个完全用红宝石编写的红宝石端口,这使得它更容易阅读(至少对我而言)。

在这种情况下,Enumberable#sort只会将Enumerable对象转换为Array对象,然后调用Array#sort

在Rubinius中,Array#sort只需拨打Array#sortinplace,然后根据数组大小调用Array#isortArray#mergesort

isort(插入排序)和mergesort都是常见的排序算法,无论用什么语言编写都几乎相同,并且可以轻松搜索以获得更好的理解。

答案 1 :(得分:1)

1..10是数字从1到10(步长1)的数组的缩写。 |a,b|从数组中选取两个数字,b <=> a对其进行比较。当+1大于b时,它会a,当相等时会0,或者当-1更小时,会提供10 <=> 9。对于+1,结果为{{1}}。 基于此,执行普通的数组排序。老实说,我不知道Ruby使用的排序算法。

答案 2 :(得分:0)

Ruby根据最新的源代码

使用quicksort