0
|
Alex Ghiculescu · 技术社区 · 6 年前 |
1
53
两者 MRI 的 sort 和 sort_by 是 unstable . 前一段时间有一个 request 使他们稳定下来,但被拒绝了。原因:ruby使用 in-place quicksort algorithm ,如果不需要稳定性,则性能更好。注意,您仍然可以从不稳定的方法实现稳定的方法:
|
2
16
不,ruby的内置排序不稳定。 如果你想要稳定的排序,这应该是可行的。如果你想经常使用它,你可能想为它创建一个方法。
基本上它跟踪每个项目的原始数组索引,并在
更多信息,为了好奇: 据我所知,使用原始数组索引作为结扎符是确保使用不稳定排序时唯一稳定的方法。项目的实际属性(或其他数据)不会告诉您它们的原始顺序。
你的例子有些做作,因为
使用原始索引也会处理这个问题。 更新: 马茨自己的建议(见 this page )是类似的,并且可能比上面的效率略高:
|
3
7
对于Ruby的一些实现,排序是稳定的,但是你不应该依赖它。露比排序的稳定性是定义的实现。 文档说明了什么The documentation 说你不应该依赖稳定的排序:
请注意,这并不能说明排序是否稳定。只是说不能保证稳定。任何给定的ruby实现都可以有一个稳定的排序,并且仍然与文档保持一致。它也可能有一个不稳定的排序,或者随时改变排序是否稳定。 鲁比到底做了什么
此测试代码打印
以下是我在Linux上安装的所有Ruby的结果:
我们可以看到JRuby是不稳定的,而Linux上2.2之前的MRI是不稳定的。mri>=2.2.0是稳定的(同样,在Linux上)。 不过,这个平台很重要。虽然在Linux上MRI排序2.4.1的排序是稳定的,但是相同的版本在Windows上是不稳定的:
为什么MRI在Linux上排序稳定,但在Windows上不稳定?即使在ruby实现的单一版本中,排序算法也可以更改。核磁共振至少可以使用三种不同的类型。排序例程在编译时使用 util.c 是的。看起来mri至少可以使用两个不同库中的排序。它也有自己的实现。 你该怎么办?由于排序可能是稳定的,但不能保证是稳定的,所以不要编写依赖于ruby排序是否稳定的代码。当在不同版本、实现或平台上使用时,该代码可能会中断。 |
4
-4
就我个人而言,我不会指望这个。不如这样做:
|
Stilian · 存储库设置中没有Github页面部分 2 年前 |
Kellen · 查看$卷展栏功能列表 2 年前 |
Akshit Thakur Ak · 我怎样才能把铁轨停下来? 2 年前 |
johncssjs · 将数组转换为每个元素的嵌套哈希 2 年前 |
solidsnake99 · Rails db:如何绕过验证 2 年前 |