Ruby中的sort稳定吗?也就是说,对于sort个并列的元素,它们之间的相对顺序是否保持了原始顺序?例如,假设:

a = [
  {id: :a, int: 3},
  {id: :b, int: 1},
  {id: :c, int: 2},
  {id: :d, int: 0},
  {id: :e, int: 1},
  {id: :f, int: 0},
  {id: :g, int: 1},
  {id: :h, int: 2},
]

能保证我们总能得到

a.sort_by{|h| h[:int]}

下面

[
  {id: :d, int: 0},
  {id: :f, int: 0},
  {id: :b, int: 1},
  {id: :e, int: 1},
  {id: :g, int: 1},
  {id: :c, int: 2},
  {id: :h, int: 2},
  {id: :a, int: 3},
]

:id值的元素:d:f:b:e:g:c:h之间的相对顺序没有任何变化?如果是这样的话,文档中的描述在哪里?

这个问题可能与this question有关,也可能与this question无关.

推荐答案

MRIsortsort_by都是unstable.不久前,有一个request使他们稳定,但它被拒绝.原因:Ruby使用in-place quicksort algorithm,如果不需要 solidity ,它的性能会更好.请注意,您仍然可以从不稳定的方法中实现稳定的方法:

module Enumerable
  def stable_sort
    sort_by.with_index { |x, idx| [x, idx] }
  end

  def stable_sort_by
    sort_by.with_index { |x, idx| [yield(x), idx] }
  end
end

Ruby相关问答推荐

当bsearch将数组中的第一个元素与2个值匹配时,它返回nil.为什么?

类似于模块的 attr_accessor 和 attr_reader 的东西?

这个#divmod 方法输出这个结果是做什么的?

如何返回此 OOP Ruby 代码最后一行中的变量?

RSpec 模拟对象示例

Ruby: initialize() vs 类体(class body)?

如何判断 Ruby 文件是否为空?

如何使用 Ruby 删除字符串中某个字符后的子字符串?

如何在新行之间拆分字符串并保留空白行?

`expect`测试中的Rspec`eq`与`eql`

Ruby 连接字符串并添加空格

有效的Electron邮件地址正则表达式?

Ruby 中的发送方法

`require': no such file to load in ruby

覆盖子类中的 ruby​​ 常量,以便继承的方法使用新常量而不是旧常量?

无法对 ruby​​ 哈希使用点语法

如何获取当前 rake 任务的 PID?

对哈希中数组的值求和

Ruby:除非与如果不是

当我们导入 csv 数据时,如何消除UTF-8 中的无效字节序列