RFR: JDK-8266431: Dual-Pivot Quicksort improvements (Radix sort)
Jörn Horstmann
github.com+689138+jhorstmann at openjdk.java.net
Mon Sep 13 17:28:48 UTC 2021
On Sat, 8 May 2021 20:54:48 GMT, iaroslavski <github.com+43264149+iaroslavski at openjdk.org> wrote:
> Sorting:
>
> - adopt radix sort for sequential and parallel sorts on int/long/float/double arrays (almost random and length > 6K)
> - fix tryMergeRuns() to better handle case when the last run is a single element
> - minor javadoc and comment changes
>
> Testing:
> - add new data inputs in tests for sorting
> - add min/max/infinity values to float/double testing
> - add tests for radix sort
src/java.base/share/classes/java/util/DualPivotQuicksort.java line 669:
> 667:
> 668: for (int i = low; i < high; ++i) {
> 669: count1[ a[i] & 0xFF]--;
Not a reviewer, but having recently implemented a radixsort myself I'm wondering what is the logic or benefit of decrementing and counting backwards here?
One thing I did differently, and I'm not fully sure is an optimization, is remembering the last bucket for each of the 4 counts. Checking whether the data is already sorted by that digit can then be done by checking `count[last_bucket] == size`, which avoids the first loop in `passLevel`. Again, not sure whether it is actually faster, maybe the two separate simple loops like here are better.
-------------
PR: https://git.openjdk.java.net/jdk/pull/3938
More information about the core-libs-dev
mailing list