Bug #11379
closedDifference in `Array#sort_by` method between Ubuntu Linux and OS X
Description
The sort order (for the same objects) is different depending on the operating system. It looks like the Linux version of sorting has changed versus the previous ruby versions.
On Linux:¶
piotr@pi-virtualbox:~$ uname -a
Linux pi-virtualbox 3.13.0-49-generic #83-Ubuntu SMP Fri Apr 10 20:14:51 UTC 2015 i686 i686 i686 GNU/Linux
piotr@pi-virtualbox:~$ ruby --version
ruby 2.2.2p95 (2015-04-13 revision 50295) [i686-linux]
piotr@pi-virtualbox:~$ irb
irb(main):001:0> ['az', 'ac', 'AC'].sort_by {|s| s.downcase}
=> ["ac", "AC", "az"]
On OS X:¶
pi@mac:~$ uname -a
Darwin mac.local 14.4.0 Darwin Kernel Version 14.4.0: Thu May 28 11:35:04 PDT 2015; root:xnu-2782.30.5~1/RELEASE_X86_64 x86_64
pi@mac:~$ ruby --version
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14]
pi@mac:~$ irb
irb(main):001:0> ['az', 'ac', 'AC'].sort_by {|s| s.downcase}
=> ["AC", "ac", "az"]
The bug is not present in 1.9.3 and 2.1.x.
I also confirmed it's not fixed in 2.2.2 and 2.3.0-dev.
Updated by nobu (Nobuyoshi Nakada) over 9 years ago
- Status changed from Open to Rejected
Not a bug.
Array#sort_by
is not stable sort.
Updated by nobu (Nobuyoshi Nakada) over 9 years ago
- Status changed from Rejected to Open
Sorry, it is not a stability issue.
Updated by nobu (Nobuyoshi Nakada) over 9 years ago
- Status changed from Open to Rejected
It is a stability issue.
Enumerable#sort_by
compares only the results of the given block, so can't differentiate "ac" and "AC".
Maybe you may want to write as:
['az', 'ac', 'AC'].sort_by {|s| [s.downcase, s]}
Updated by pibako (Piotr Kowalski) over 9 years ago
What do you mean that it's a stability issue? I understand that the order cannot be guaranteed but I would expect it to work the same on all platforms.
Also this code works fine with 1.9.3 and 2.1.6 and only fails with 2.2.
Updated by funny_falcon (Yura Sokolov) over 9 years ago
I understand that the order cannot be guaranteed but I would expect it to work the same on all platforms.
And you will be wrong.
You may not expect order is same even with two subsequent sort invocation.
Every "same order" produced by unstable sorting on a set with some equal elements should be treated as occasional.
Updated by pibako (Piotr Kowalski) over 9 years ago
You may not expect order is same even with two subsequent sort invocation.
Non deterministic algorithm... makes sense. Is that somewhere stated in documentation?
Just curious, do you happen to know what has changed in ruby 2.2 linux version?
Updated by nobu (Nobuyoshi Nakada) over 9 years ago
Because qsort_r()
of glibc is used instead of ruby_qsort()
.
Updated by pibako (Piotr Kowalski) over 9 years ago
All clear, thank you.