2014-09-03 68 views
-1

我试图了解使用像sort方法:通过观察its source code排序方法如何工作?需要了解的源代码

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

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

,但我不明白怎么样工作的。请帮我理解它是如何进行分类的。

+0

你的问题是误导/不清楚使用quicksort。你想知道排序是如何工作的,或者你想知道在核磁共振成像中C的实现是如何工作的? – sawa 2014-09-04 00:18:56

+2

您正在寻找[MRI](http://rxr.whitequark.org/mri/source/array.c#2385)。你可以使用你的源代码来追踪它。找到rb_ary_sort,然后在复制数组后重新调用rb_ary_sort_bang ...你就明白了。 – engineersmnky 2014-09-04 00:43:21

+0

@sawa - 我需要了解源代码的工作原理。如果这是有道理的,你能否把我的分数提高到零点?谢谢。 – 2014-10-13 05:50:21

回答

2

任何时候,我有这样的问题,我觉得这是有帮助的看看Rubinius的同样的方法定义。 Rubinius是一个完全用红宝石书写的红宝石,它使读起来更容易(至少对我来说)。

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

在Rubinius的,Array#sort只是调用Array#sortinplace后者又调用任一Array#isortArray#mergesort,取决于阵列的大小。

两个isort(插入排序)和归并是常见的排序algorithims,这将是几乎相同的,无论它们被写入其中语言,可以很容易地用Google搜索,以获得更好的理解。

+0

看起来问题是关于MRI。鲁比尼乌斯无关紧要。 – sawa 2014-09-04 00:08:32

+1

OP是Ruby的新手,只是想了解排序的工作原理。我的想法是Rubinius方法比MRI实现更容易理解,同时仍然解释前提。 – Josh 2014-09-04 00:10:10

1

1..10短用于与数字的阵列从1到10(步长1)。 |a,b|从数组中挑选两个数字并将其与b <=> a进行比较。它提供+1b是大于a0当等于或-1时更小,例如为10 <=> 9结果为+1。 基于此,执行普通的数组排序。老实说,我不知道Ruby使用的排序算法。

+2

虽然不是一个糟糕的解释,但你可能不应该说1..10“是阵列的简称”。这是一个范围,这是一个不同的对象。是的,它是一个包含Enumerable方法的对象,因此Array和Range共享方法,但它们不相同。 – engineersmnky 2014-09-04 00:48:24

+2

“我不知道Ruby使用的排序算法。” - 没有。该规范没有规定一个。 MRI和YARV使用quicksort,我相信Rubinius使用mergesort和插入排序,JRuby只是调用Java排序方法(这又取决于实现)。 – 2014-09-04 01:42:13

0

红宝石根据最新的源代码