Ruby-为什么排序会对相等的元素重新排序

Ruby-为什么排序会对相等的元素重新排序,ruby,sorting,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: [{:

我试图对哈希数组进行反向排序,而不改变相等的哈希顺序。但是,我在
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}]
[{a:1,b:2},{a:0,b:5},{a:1,b:4},{a:1,b:3}]。排序{a,b | b[:a]a[:a]}
#实际值:[{:a=>1,:b=>2},{:a=>1,:b=>3},{:a=>1,:b=>4},{:a=>0,:b=>5}]
#应为:[{:a=>1,:b=>2},{:a=>1,:b=>4},{:a=>1,:b=>3},{:a=>0,:b=>5}]
带有
:b=>4
:b=>3
的散列被错误地重新排序。我是否误解了排序的工作原理

数组#排序
在引擎盖下使用快速排序算法。此算法不稳定:无法保证相等的元素不会在输出中重新排序。基本上,当您在Ruby中进行排序时,您应该确切地指定事物应该如何排序,而不是让它靠运气。您可以通过使用
sort\u by
并将元素的索引添加到排序条件中来处理您的情况:

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

它重新排序了数组中具有匹配值的某些项,这似乎是您的问题。这是因为原生ruby排序使用了快速排序算法

您在这里阅读了关于quicksort的文章和关于ruby实现的文章


您得到的结果是根据排序标准正确排序的,但它可能会对过程中的一些类似条目重新排序。

您的预期结果和第一行的输出不一样吗?你到底在做什么/在问什么?是的,第一个命令和输出就是我预期的结果。第二组不是我所期望的。那么,你是说一种语言中最常用的方法之一没有返回你所期望的结果,所以它有一个缺陷?@theTinMan问,不是说。好吧,那么,你是问sort,这是一种语言中最常用的方法之一,有一个缺陷,因为它没有返回您期望的结果?
sort\u by
也可以使它快得多。@TIMBERings啊,您希望
Array\35; sort
稳定,即不重新排列数组中的相等元素。我会编辑的。是的,我和@theTinMan在一起。除非有严格的必要,否则我甚至不会为排序而烦恼。