Hello,

The optimization of -0.0 and NaN handling in Dual-Pivot Quicksort
was done for sorting float and double values. The sorting of
floating-point values is done in three phases:

1. Move out NaN to the end of array, count -0.0 and convert it to 0.0
2. Sort everything except NaNs
   If count of negative zeros is 0, exit.
3. Turn positive zeros back into negative zeros as appropriate

This structure was used also before but in phase 3 standard binary
search (from Arrays) is used. Note that in last phase we know
that at least one zero must be in the array and we consider
part of the array without NaNs. These conditions allows us to
simplify the binary search to:

private static int findAnyZero(float[] a, int low, int high) {
    while (true) {
        int middle = (low + high) >>> 1;
        float middleValue = a[middle];

        if (middleValue < 0.0f) {
            low = middle + 1;
        } else if (middleValue > 0.0f) {
            high = middle - 1;
        } else { // middleValue == 0.0f
            return middle;
        }
    }
}

Note that there are no checks with converted values to int/long bits
and no check in while loop.

You can find full version of DualPivotQuicksort at the webrev:
http://cr.openjdk.java.net/~alanb/6899694/webrev.00

Also additional test cases in Sorting class have been added.

Thank you,
Vladimir

Reply via email to