Ruby - 为什么排序重新排序相同的元素

时间:2014-11-06 20:47:03

标签: ruby sorting

我尝试反向排序哈希数组而不改变相等的哈希顺序。但是,我没有在sort中看到此功能。

例如,

[{a:1, b:2}, {a:0, b:5}, {a:1,b:4}, {a:1,b:3}].sort { |a,b| b[:a] <=> a[:a] }
# actual:   [{:a=>1, :b=>2}, {:a=>1, :b=>3}, {:a=>1, :b=>4}, {:a=>0, :b=>5}]
# expected: [{:a=>1, :b=>2}, {:a=>1, :b=>4}, {:a=>1, :b=>3}, {:a=>0, :b=>5}]

:b=>4:b=>3的哈希值未正确重新排序。我是否误解了排序的运作方式?

2 个答案:

答案 0 :(得分:4)

Array#sort使用快速排序算法。此算法不是 stable :无法保证在输出中不会重新排序相等的元素。基本上,当您在Ruby中进行排序时,您应该指定完全应该如何对事物进行排序,而不是将其留给机会。您可以使用sort_by并将元素的索引添加到排序条件来处理您的案例:

ary.sort_by.with_index { |h, i| [-h[:a], i] }

答案 1 :(得分:1)

它看起来有一个问题,即它重新排序了数组中具有匹配值的一些条目。这是因为本机ruby排序使用的快速排序算法。

您在这里阅读了关于quicksort的http://en.wikipedia.org/wiki/Quicksort以及关于ruby实施的文章https://www.igvita.com/2009/03/26/ruby-algorithms-sorting-trie-heaps

您获得的结果会根据排序条件正确排序,但可能会重新排序流程中的某些类似条目。