我试图了解使用像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));
}
,但我不明白怎么样工作的。请帮我理解它是如何进行分类的。
我试图了解使用像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));
}
,但我不明白怎么样工作的。请帮我理解它是如何进行分类的。
任何时候,我有这样的问题,我觉得这是有帮助的看看Rubinius的同样的方法定义。 Rubinius是一个完全用红宝石书写的红宝石,它使读起来更容易(至少对我来说)。
在这种情况下,Enumberable#sort
只是将Enumerable
对象转换为Array
对象,然后调用Array#sort
。
在Rubinius的,Array#sort只是调用Array#sortinplace后者又调用任一Array#isort或Array#mergesort,取决于阵列的大小。
两个isort(插入排序)和归并是常见的排序algorithims,这将是几乎相同的,无论它们被写入其中语言,可以很容易地用Google搜索,以获得更好的理解。
1..10
短用于与数字的阵列从1到10(步长1)。 |a,b|
从数组中挑选两个数字并将其与b <=> a
进行比较。它提供+1
当b
是大于a
,0
当等于或-1
时更小,例如为10 <=> 9
结果为+1
。 基于此,执行普通的数组排序。老实说,我不知道Ruby使用的排序算法。
虽然不是一个糟糕的解释,但你可能不应该说1..10“是阵列的简称”。这是一个范围,这是一个不同的对象。是的,它是一个包含Enumerable方法的对象,因此Array和Range共享方法,但它们不相同。 – engineersmnky 2014-09-04 00:48:24
“我不知道Ruby使用的排序算法。” - 没有。该规范没有规定一个。 MRI和YARV使用quicksort,我相信Rubinius使用mergesort和插入排序,JRuby只是调用Java排序方法(这又取决于实现)。 – 2014-09-04 01:42:13
红宝石根据最新的源代码
你的问题是误导/不清楚使用quicksort。你想知道排序是如何工作的,或者你想知道在核磁共振成像中C的实现是如何工作的? – sawa 2014-09-04 00:18:56
您正在寻找[MRI](http://rxr.whitequark.org/mri/source/array.c#2385)。你可以使用你的源代码来追踪它。找到rb_ary_sort,然后在复制数组后重新调用rb_ary_sort_bang ...你就明白了。 – engineersmnky 2014-09-04 00:43:21
@sawa - 我需要了解源代码的工作原理。如果这是有道理的,你能否把我的分数提高到零点?谢谢。 – 2014-10-13 05:50:21