Project

General

Profile

Actions

Bug #11379

closed

Difference in `Array#sort_by` method between Ubuntu Linux and OS X

Bug #11379: Difference in `Array#sort_by` method between Ubuntu Linux and OS X

Added by pibako (Piotr Kowalski) over 10 years ago. Updated over 10 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 2.3.0dev (2015-07-21 trunk 51310) [i686-linux]
[ruby-core:70061]

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 10 years ago Actions #1 [ruby-core:70063]

  • Status changed from Open to Rejected

Not a bug.
Array#sort_by is not stable sort.

Updated by nobu (Nobuyoshi Nakada) over 10 years ago Actions #2 [ruby-core:70064]

  • Status changed from Rejected to Open

Sorry, it is not a stability issue.

Updated by nobu (Nobuyoshi Nakada) over 10 years ago Actions #3 [ruby-core:70065]

  • 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 10 years ago Actions #4 [ruby-core:70066]

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 10 years ago Actions #5 [ruby-core:70084]

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 10 years ago Actions #6 [ruby-core:70085]

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 10 years ago Actions #7 [ruby-core:70086]

Because qsort_r() of glibc is used instead of ruby_qsort().

Updated by pibako (Piotr Kowalski) over 10 years ago Actions #8 [ruby-core:70087]

All clear, thank you.

Actions

Also available in: PDF Atom