Issue #20226 has been updated by ufuk (Ufuk Kayserilioglu).
Regardless of any individual impressions, Ruby never made any stability guarantees for
sorting. It was always explicit that sorting MAY BE unstable. This is because Ruby
delegates the actual sorting to the efficient sorting routines provided by the platform in
most cases, and those routines are free to handle sorting with whichever algorithm would
be the most efficient for the input. This means that a sort that is always stable on macOS
could show unstable results on Linux, for example, or vice versa.
So, regardless of what you are observing, Ruby makes no guarantees about the stability of
sorting and that has always been the case.
I've linked to a conversation from 15 years ago about making the sort stable, which
was rejected at the time. If you would like to propose a path forward for stable sorting
guarantees in Ruby, please open a Feature ticket with the proposed implementation and
performance implications.
----------------------------------------
Bug #20226: Inconsistent Sort results on 3.3.0 compared to previous versions
https://bugs.ruby-lang.org/issues/20226#change-106526
* Author: omerby (Omer Ben Yosef)
* Status: Open
* Priority: Normal
* ruby -v: 3.3.0
* Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
Try this code block:
```
[-0.9, -0.88, -0.85, -0.83, -0.81, -0.79, -0.77, -0.75, -0.73, -0.71, -0.69, -0.67, -0.65,
-0.63, -0.6, -0.58, -0.56, -0.54, -0.52,
-0.5, -0.48, -0.46, -0.44, -0.42, -0.4, -0.38, -0.35, -0.33, -0.31, -0.29, -0.27, -0.25,
-0.23, -0.21, -0.19, -0.17, -0.15, -0.13,
-0.1, -0.08, -0.06, -0.04, -0.02, 0.0, 0.02, 0.0, 0.02].sort_by(&:abs)
```
The end result should be the numbers absolute sorted, look at the last 5 numbers of this,
the end result of them should be `[0.0, 0.0, -0.02, 0.02, 0.02...]` maintaining the
original order, and this behavior is what we see on ruby 3.2.0, however on ruby 3.3.0 the
end result will be `[0.0, 0.0, 0.02, 0.02, -0.02...]`
This is also inconsistent, as `[-0.02, 0.0, 0.02, 0.0, 0.02].sort_by(&:abs)` will
actually provide the expected result.
Again, the main issue for us is the difference between 3.3.0 and previous versions of
ruby.
--
https://bugs.ruby-lang.org/