jdk/test/java/util/Arrays/Sorting.java
author alanb
Wed, 11 Nov 2009 14:38:01 +0000
changeset 4233 9b594a48d0f4
parent 4177 208f8c11e7ba
child 5506 202f599c92aa
permissions -rw-r--r--
6899694: Dual-pivot quicksort improvements Reviewed-by: jjb Contributed-by: vladimir.yaroslavskiy@sun.com, joshua.bloch@google.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
     1
/*
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
     2
 * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
     4
 *
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
     8
 *
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    13
 * accompanied this code).
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    14
 *
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    18
 *
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    21
 * have any questions.
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    22
 */
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    23
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    24
/*
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    25
 * @test
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    26
 * @bug 6880672 6896573 6899694
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    27
 * @summary Exercise Arrays.sort
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    28
 * @build Sorting
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    29
 * @run main Sorting -shortrun
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    30
 *
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    31
 * @author Vladimir Yaroslavskiy
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    32
 * @author Jon Bentley
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    33
 * @author Josh Bloch
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    34
 */
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    35
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    36
import java.util.Arrays;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    37
import java.util.Random;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    38
import java.io.PrintStream;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    39
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    40
public class Sorting {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    41
    private static final PrintStream out = System.out;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    42
    private static final PrintStream err = System.err;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    43
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    44
    // Array lengths used in a long run (default)
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    45
    private static final int[] LONG_RUN_LENGTHS = {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    46
        1, 2, 3, 5, 8, 13, 21, 34, 55, 100, 1000, 10000, 100000, 1000000};
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    47
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    48
    // Array lengths used in a short run
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    49
    private static final int[] SHORT_RUN_LENGTHS = { 1, 2, 3, 21, 55, 1000, 10000 };
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    50
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    51
    // Random initial values used in a long run (default)
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    52
    private static final long[] LONG_RUN_RANDOMS = {666, 0xC0FFEE, 999};
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    53
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    54
    // Random initial values used in a short run
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    55
    private static final long[] SHORT_RUN_RANDOMS = {666};
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    56
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    57
    public static void main(String[] args) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    58
        boolean shortRun = args.length > 0 && args[0].equals("-shortrun");
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    59
        long start = System.currentTimeMillis();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    60
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    61
        if (shortRun) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    62
            testAndCheck(SHORT_RUN_LENGTHS, SHORT_RUN_RANDOMS);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    63
        } else {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    64
            testAndCheck(LONG_RUN_LENGTHS, LONG_RUN_RANDOMS);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    65
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    66
        long end = System.currentTimeMillis();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    67
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    68
        out.format("PASS in %d sec.\n", Math.round((end - start) / 1E3));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    69
    }
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    70
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    71
    private static void testAndCheck(int[] lengths, long[] randoms) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    72
        for (long random : randoms) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    73
            reset(random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    74
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    75
            for (int len : lengths) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    76
                testAndCheckWithCheckSum(len, random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    77
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    78
            reset(random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    79
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    80
            for (int len : lengths) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    81
                testAndCheckWithScrambling(len, random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    82
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    83
            reset(random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    84
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    85
            for (int len : lengths) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    86
                testAndCheckFloat(len, random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    87
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    88
            reset(random);
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
    89
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    90
            for (int len : lengths) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    91
                testAndCheckDouble(len, random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    92
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    93
            reset(random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    94
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    95
            for (int len : lengths) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    96
                testAndCheckRange(len, random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    97
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    98
            reset(random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
    99
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   100
            for (int len : lengths) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   101
                testAndCheckSubArray(len, random);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   102
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   103
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   104
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   105
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   106
    private static void testAndCheckSubArray(int len, long random) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   107
        int[] golden = new int[len];
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   108
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   109
        for (int m = 1; m < len / 2; m *= 2) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   110
            int fromIndex = m;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   111
            int toIndex = len - m;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   112
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   113
            prepareSubArray(golden, fromIndex, toIndex, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   114
            int[] test = golden.clone();
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   115
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   116
            for (TypeConverter converter : TypeConverter.values()) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   117
                out.println("Test #6: " + converter +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   118
                   " len = " + len + ", m = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   119
                Object convertedGolden = converter.convert(golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   120
                Object convertedTest = converter.convert(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   121
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   122
                // outArr(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   123
                sortSubArray(convertedTest, fromIndex, toIndex);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   124
                // outArr(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   125
                checkSubArray(convertedTest, fromIndex, toIndex, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   126
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   127
        }
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   128
        out.println();
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   129
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   130
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   131
    private static void testAndCheckRange(int len, long random) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   132
        int[] golden = new int[len];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   133
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   134
        for (int m = 1; m < 2 * len; m *= 2) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   135
            for (int i = 1; i <= len; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   136
                golden[i - 1] = i % m + m % i;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   137
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   138
            for (TypeConverter converter : TypeConverter.values()) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   139
                out.println("Test #5: " + converter +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   140
                   ", len = " + len + ", m = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   141
                Object convertedGolden = converter.convert(golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   142
                sortRange(convertedGolden, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   143
                sortEmpty(convertedGolden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   144
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   145
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   146
        out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   147
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   148
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   149
    private static void testAndCheckWithCheckSum(int len, long random) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   150
        int[] golden = new int[len];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   151
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   152
        for (int m = 1; m < 2 * len; m *= 2) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   153
            for (UnsortedBuilder builder : UnsortedBuilder.values()) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   154
                builder.build(golden, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   155
                int[] test = golden.clone();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   156
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   157
                for (TypeConverter converter : TypeConverter.values()) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   158
                    out.println("Test #1: " + converter + " " + builder +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   159
                       "random = " +  random + ", len = " + len +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   160
                       ", m = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   161
                    Object convertedGolden = converter.convert(golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   162
                    Object convertedTest = converter.convert(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   163
                    sort(convertedTest);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   164
                    checkWithCheckSum(convertedTest, convertedGolden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   165
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   166
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   167
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   168
        out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   169
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   170
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   171
    private static void testAndCheckWithScrambling(int len, long random) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   172
        int[] golden = new int[len];
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   173
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   174
        for (int m = 1; m <= 7; m++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   175
            if (m > len) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   176
                break;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   177
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   178
            for (SortedBuilder builder : SortedBuilder.values()) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   179
                builder.build(golden, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   180
                int[] test = golden.clone();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   181
                scramble(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   182
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   183
                for (TypeConverter converter : TypeConverter.values()) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   184
                    out.println("Test #2: " + converter + " " + builder +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   185
                       "random = " +  random + ", len = " + len +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   186
                       ", m = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   187
                    Object convertedGolden = converter.convert(golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   188
                    Object convertedTest = converter.convert(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   189
                    sort(convertedTest);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   190
                    compare(convertedTest, convertedGolden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   191
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   192
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   193
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   194
        out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   195
    }
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   196
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   197
    private static void testAndCheckFloat(int len, long random) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   198
        float[] golden = new float[len];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   199
        final int MAX = 10;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   200
        boolean newLine = false;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   201
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   202
        for (int a = 0; a <= MAX; a++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   203
            for (int g = 0; g <= MAX; g++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   204
                for (int z = 0; z <= MAX; z++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   205
                    for (int n = 0; n <= MAX; n++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   206
                        for (int p = 0; p <= MAX; p++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   207
                            if (a + g + z + n + p > len) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   208
                                continue;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   209
                            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   210
                            if (a + g + z + n + p < len) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   211
                                continue;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   212
                            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   213
                            for (FloatBuilder builder : FloatBuilder.values()) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   214
                                out.println("Test #3: random = " + random +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   215
                                   ", len = " + len + ", a = " + a + ", g = " + g +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   216
                                   ", z = " + z + ", n = " + n + ", p = " + p);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   217
                                builder.build(golden, a, g, z, n, p);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   218
                                float[] test = golden.clone();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   219
                                scramble(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   220
                                // outArr(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   221
                                sort(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   222
                                // outArr(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   223
                                compare(test, golden, a, n, g);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   224
                            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   225
                            newLine = true;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   226
                        }
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   227
                    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   228
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   229
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   230
        }
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   231
        if (newLine) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   232
            out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   233
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   234
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   235
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   236
    private static void testAndCheckDouble(int len, long random) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   237
        double[] golden = new double[len];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   238
        final int MAX = 10;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   239
        boolean newLine = false;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   240
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   241
        for (int a = 0; a <= MAX; a++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   242
            for (int g = 0; g <= MAX; g++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   243
                for (int z = 0; z <= MAX; z++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   244
                    for (int n = 0; n <= MAX; n++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   245
                        for (int p = 0; p <= MAX; p++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   246
                            if (a + g + z + n + p > len) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   247
                                continue;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   248
                            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   249
                            if (a + g + z + n + p < len) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   250
                                continue;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   251
                            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   252
                            for (DoubleBuilder builder : DoubleBuilder.values()) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   253
                                out.println("Test #4: random = " + random +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   254
                                   ", len = " + len + ", a = " + a + ", g = " + g +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   255
                                   ", z = " + z + ", n = " + n + ", p = " + p);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   256
                                builder.build(golden, a, g, z, n, p);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   257
                                double[] test = golden.clone();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   258
                                scramble(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   259
                                // outArr(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   260
                                sort(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   261
                                // outArr(test);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   262
                                compare(test, golden, a, n, g);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   263
                            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   264
                            newLine = true;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   265
                        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   266
                    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   267
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   268
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   269
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   270
        if (newLine) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   271
            out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   272
        }
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   273
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   274
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   275
    private static void prepareSubArray(int[] a, int fromIndex, int toIndex, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   276
        for (int i = 0; i < fromIndex; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   277
            a[i] = 0xBABA;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   278
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   279
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   280
        for (int i = fromIndex; i < toIndex; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   281
            a[i] = -i + m;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   282
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   283
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   284
        for (int i = toIndex; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   285
            a[i] = 0xDEDA;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   286
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   287
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   288
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   289
    private static void scramble(int[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   290
        int length = a.length;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   291
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   292
        for (int i = 0; i < length * 7; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   293
            swap(a, ourRandom.nextInt(length), ourRandom.nextInt(length));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   294
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   295
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   296
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   297
    private static void scramble(float[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   298
        int length = a.length;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   299
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   300
        for (int i = 0; i < length * 7; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   301
            swap(a, ourRandom.nextInt(length), ourRandom.nextInt(length));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   302
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   303
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   304
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   305
    private static void scramble(double[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   306
        int length = a.length;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   307
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   308
        for (int i = 0; i < length * 7; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   309
            swap(a, ourRandom.nextInt(length), ourRandom.nextInt(length));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   310
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   311
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   312
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   313
    private static void swap(int[] a, int i, int j) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   314
        int t = a[i];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   315
        a[i] = a[j];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   316
        a[j] = t;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   317
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   318
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   319
    private static void swap(float[] a, int i, int j) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   320
        float t = a[i];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   321
        a[i] = a[j];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   322
        a[j] = t;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   323
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   324
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   325
    private static void swap(double[] a, int i, int j) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   326
        double t = a[i];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   327
        a[i] = a[j];
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   328
        a[j] = t;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   329
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   330
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   331
    private static enum TypeConverter {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   332
        INT {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   333
            Object convert(int[] a) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   334
                return a.clone();
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   335
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   336
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   337
        LONG {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   338
            Object convert(int[] a) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   339
                long[] b = new long[a.length];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   340
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   341
                for (int i = 0; i < a.length; i++) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   342
                    b[i] = (long) a[i];
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   343
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   344
                return b;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   345
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   346
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   347
        BYTE {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   348
            Object convert(int[] a) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   349
                byte[] b = new byte[a.length];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   350
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   351
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   352
                    b[i] = (byte) a[i];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   353
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   354
                return b;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   355
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   356
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   357
        SHORT {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   358
            Object convert(int[] a) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   359
                short[] b = new short[a.length];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   360
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   361
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   362
                    b[i] = (short) a[i];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   363
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   364
                return b;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   365
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   366
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   367
        CHAR {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   368
            Object convert(int[] a) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   369
                char[] b = new char[a.length];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   370
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   371
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   372
                    b[i] = (char) a[i];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   373
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   374
                return b;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   375
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   376
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   377
        FLOAT {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   378
            Object convert(int[] a) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   379
                float[] b = new float[a.length];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   380
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   381
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   382
                    b[i] = (float) a[i];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   383
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   384
                return b;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   385
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   386
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   387
        DOUBLE {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   388
            Object convert(int[] a) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   389
                double[] b = new double[a.length];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   390
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   391
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   392
                    b[i] = (double) a[i];
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   393
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   394
                return b;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   395
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   396
        };
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   397
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   398
        abstract Object convert(int[] a);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   399
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   400
        @Override public String toString() {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   401
            String name = name();
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   402
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   403
            for (int i = name.length(); i < 9; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   404
                name += " ";
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   405
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   406
            return name;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   407
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   408
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   409
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   410
    private static enum FloatBuilder {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   411
        SIMPLE {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   412
            void build(float[] x, int a, int g, int z, int n, int p) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   413
                int fromIndex = 0;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   414
                float negativeValue = -ourRandom.nextFloat();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   415
                float positiveValue =  ourRandom.nextFloat();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   416
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   417
                writeValue(x, negativeValue, fromIndex, n);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   418
                fromIndex += n;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   419
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   420
                writeValue(x, -0.0f, fromIndex, g);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   421
                fromIndex += g;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   422
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   423
                writeValue(x, 0.0f, fromIndex, z);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   424
                fromIndex += z;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   425
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   426
                writeValue(x, positiveValue, fromIndex, p);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   427
                fromIndex += p;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   428
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   429
                writeValue(x, Float.NaN, fromIndex, a);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   430
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   431
        };
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   432
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   433
        abstract void build(float[] x, int a, int g, int z, int n, int p);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   434
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   435
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   436
    private static enum DoubleBuilder {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   437
        SIMPLE {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   438
            void build(double[] x, int a, int g, int z, int n, int p) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   439
                int fromIndex = 0;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   440
                double negativeValue = -ourRandom.nextFloat();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   441
                double positiveValue =  ourRandom.nextFloat();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   442
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   443
                writeValue(x, negativeValue, fromIndex, n);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   444
                fromIndex += n;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   445
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   446
                writeValue(x, -0.0d, fromIndex, g);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   447
                fromIndex += g;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   448
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   449
                writeValue(x, 0.0d, fromIndex, z);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   450
                fromIndex += z;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   451
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   452
                writeValue(x, positiveValue, fromIndex, p);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   453
                fromIndex += p;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   454
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   455
                writeValue(x, Double.NaN, fromIndex, a);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   456
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   457
        };
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   458
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   459
        abstract void build(double[] x, int a, int g, int z, int n, int p);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   460
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   461
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   462
    private static void writeValue(float[] a, float value, int fromIndex, int count) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   463
        for (int i = fromIndex; i < fromIndex + count; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   464
            a[i] = value;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   465
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   466
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   467
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   468
    private static void compare(float[] a, float[] b, int numNaN, int numNeg, int numNegZero) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   469
        for (int i = a.length - numNaN; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   470
            if (a[i] == a[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   471
                failed("On position " + i + " must be NaN instead of " + a[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   472
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   473
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   474
        final int NEGATIVE_ZERO = Float.floatToIntBits(-0.0f);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   475
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   476
        for (int i = numNeg; i < numNeg + numNegZero; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   477
            if (NEGATIVE_ZERO != Float.floatToIntBits(a[i])) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   478
                failed("On position " + i + " must be -0.0f instead of " + a[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   479
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   480
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   481
        for (int i = 0; i < a.length - numNaN; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   482
            if (a[i] != b[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   483
                failed(i, "" + a[i], "" + b[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   484
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   485
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   486
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   487
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   488
    private static void writeValue(double[] a, double value, int fromIndex, int count) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   489
        for (int i = fromIndex; i < fromIndex + count; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   490
            a[i] = value;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   491
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   492
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   493
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   494
    private static void compare(double[] a, double[] b, int numNaN, int numNeg, int numNegZero) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   495
        for (int i = a.length - numNaN; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   496
            if (a[i] == a[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   497
                failed("On position " + i + " must be NaN instead of " + a[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   498
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   499
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   500
        final long NEGATIVE_ZERO = Double.doubleToLongBits(-0.0d);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   501
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   502
        for (int i = numNeg; i < numNeg + numNegZero; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   503
            if (NEGATIVE_ZERO != Double.doubleToLongBits(a[i])) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   504
                failed("On position " + i + " must be -0.0d instead of " + a[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   505
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   506
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   507
        for (int i = 0; i < a.length - numNaN; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   508
            if (a[i] != b[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   509
                failed(i, "" + a[i], "" + b[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   510
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   511
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   512
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   513
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   514
    private static enum SortedBuilder {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   515
        REPEATED {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   516
            void build(int[] a, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   517
                int period = a.length / m;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   518
                int i = 0;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   519
                int k = 0;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   520
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   521
                while (true) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   522
                    for (int t = 1; t <= period; t++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   523
                        if (i >= a.length) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   524
                            return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   525
                        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   526
                        a[i++] = k;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   527
                    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   528
                    if (i >= a.length) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   529
                        return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   530
                    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   531
                    k++;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   532
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   533
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   534
        },
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   535
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   536
        ORGAN_PIPES {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   537
            void build(int[] a, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   538
                int i = 0;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   539
                int k = m;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   540
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   541
                while (true) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   542
                    for (int t = 1; t <= m; t++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   543
                        if (i >= a.length) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   544
                            return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   545
                        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   546
                        a[i++] = k;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   547
                    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   548
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   549
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   550
        };
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   551
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   552
        abstract void build(int[] a, int m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   553
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   554
        @Override public String toString() {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   555
            String name = name();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   556
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   557
            for (int i = name.length(); i < 12; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   558
                name += " ";
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   559
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   560
            return name;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   561
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   562
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   563
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   564
    private static enum UnsortedBuilder {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   565
        RANDOM {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   566
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   567
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   568
                    a[i] = ourRandom.nextInt();
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   569
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   570
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   571
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   572
        ASCENDING {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   573
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   574
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   575
                    a[i] = m + i;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   576
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   577
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   578
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   579
        DESCENDING {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   580
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   581
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   582
                    a[i] = a.length - m - i;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   583
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   584
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   585
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   586
        ALL_EQUAL {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   587
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   588
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   589
                    a[i] = m;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   590
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   591
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   592
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   593
        SAW {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   594
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   595
                int incCount = 1;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   596
                int decCount = a.length;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   597
                int i = 0;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   598
                int period = m;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   599
                m--;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   600
                while (true) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   601
                    for (int k = 1; k <= period; k++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   602
                        if (i >= a.length) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   603
                            return;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   604
                        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   605
                        a[i++] = incCount++;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   606
                    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   607
                    period += m;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   608
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   609
                    for (int k = 1; k <= period; k++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   610
                        if (i >= a.length) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   611
                            return;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   612
                        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   613
                        a[i++] = decCount--;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   614
                    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   615
                    period += m;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   616
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   617
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   618
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   619
        REPEATED {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   620
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   621
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   622
                    a[i] = i % m;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   623
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   624
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   625
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   626
        DUPLICATED {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   627
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   628
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   629
                    a[i] = ourRandom.nextInt(m);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   630
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   631
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   632
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   633
        ORGAN_PIPES {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   634
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   635
                int middle = a.length / (m + 1);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   636
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   637
                for (int i = 0; i < middle; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   638
                    a[i] = i;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   639
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   640
                for (int i = middle; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   641
                    a[i] = a.length - i - 1;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   642
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   643
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   644
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   645
        STAGGER {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   646
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   647
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   648
                    a[i] = (i * m + i) % a.length;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   649
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   650
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   651
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   652
        PLATEAU {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   653
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   654
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   655
                    a[i] = Math.min(i, m);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   656
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   657
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   658
        },
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   659
        SHUFFLE {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   660
            void build(int[] a, int m) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   661
                for (int i = 0; i < a.length; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   662
                    a[i] = ourRandom.nextBoolean() ? (ourFirst += 2) : (ourSecond += 2);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   663
                }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   664
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   665
        };
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   666
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   667
        abstract void build(int[] a, int m);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   668
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   669
        @Override public String toString() {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   670
            String name = name();
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   671
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   672
            for (int i = name.length(); i < 12; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   673
                name += " ";
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   674
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   675
            return name;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   676
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   677
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   678
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   679
    private static void compare(Object test, Object golden) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   680
        if (test instanceof int[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   681
            compare((int[]) test, (int[]) golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   682
        } else if (test instanceof long[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   683
            compare((long[]) test, (long[]) golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   684
        } else if (test instanceof short[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   685
            compare((short[]) test, (short[]) golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   686
        } else if (test instanceof byte[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   687
            compare((byte[]) test, (byte[]) golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   688
        } else if (test instanceof char[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   689
            compare((char[]) test, (char[]) golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   690
        } else if (test instanceof float[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   691
            compare((float[]) test, (float[]) golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   692
        } else if (test instanceof double[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   693
            compare((double[]) test, (double[]) golden);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   694
        } else {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   695
            failed("Unknow type of array: " + test + " of class " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   696
                test.getClass().getName());
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   697
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   698
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   699
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   700
    private static void checkWithCheckSum(Object test, Object golden) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   701
        checkSorted(test);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   702
        checkCheckSum(test, golden);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   703
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   704
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   705
    private static void failed(String message) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   706
        err.format("\n*** FAILED: %s\n\n", message);
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   707
        throw new RuntimeException("Test failed - see log file for details");
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   708
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   709
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   710
    private static void failed(int index, String value1, String value2) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   711
        failed("Array is not sorted at " + index + "-th position: " + value1 +
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   712
               " and " + value2);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   713
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   714
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   715
    private static void checkSorted(Object object) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   716
        if (object instanceof int[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   717
            checkSorted((int[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   718
        } else if (object instanceof long[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   719
            checkSorted((long[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   720
        } else if (object instanceof short[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   721
            checkSorted((short[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   722
        } else if (object instanceof byte[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   723
            checkSorted((byte[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   724
        } else if (object instanceof char[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   725
            checkSorted((char[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   726
        } else if (object instanceof float[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   727
            checkSorted((float[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   728
        } else if (object instanceof double[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   729
            checkSorted((double[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   730
        } else {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   731
            failed("Unknow type of array: " + object + " of class " +
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   732
                object.getClass().getName());
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   733
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   734
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   735
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   736
    private static void compare(int[] a, int[] b) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   737
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   738
            if (a[i] != b[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   739
                failed(i, "" + a[i], "" + b[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   740
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   741
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   742
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   743
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   744
    private static void compare(long[] a, long[] b) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   745
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   746
            if (a[i] != b[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   747
                failed(i, "" + a[i], "" + b[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   748
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   749
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   750
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   751
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   752
    private static void compare(short[] a, short[] b) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   753
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   754
            if (a[i] != b[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   755
                failed(i, "" + a[i], "" + b[i]);
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   756
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   757
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   758
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   759
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   760
    private static void compare(byte[] a, byte[] b) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   761
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   762
            if (a[i] != b[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   763
                failed(i, "" + a[i], "" + b[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   764
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   765
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   766
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   767
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   768
    private static void compare(char[] a, char[] b) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   769
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   770
            if (a[i] != b[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   771
                failed(i, "" + a[i], "" + b[i]);
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   772
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   773
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   774
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   775
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   776
    private static void compare(float[] a, float[] b) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   777
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   778
            if (a[i] != b[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   779
                failed(i, "" + a[i], "" + b[i]);
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   780
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   781
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   782
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   783
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   784
    private static void compare(double[] a, double[] b) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   785
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   786
            if (a[i] != b[i]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   787
                failed(i, "" + a[i], "" + b[i]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   788
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   789
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   790
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   791
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   792
    private static void checkSorted(int[] a) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   793
        for (int i = 0; i < a.length - 1; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   794
            if (a[i] > a[i + 1]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   795
                failed(i, "" + a[i], "" + a[i + 1]);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   796
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   797
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   798
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   799
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   800
    private static void checkSorted(long[] a) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   801
        for (int i = 0; i < a.length - 1; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   802
            if (a[i] > a[i + 1]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   803
                failed(i, "" + a[i], "" + a[i + 1]);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   804
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   805
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   806
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   807
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   808
    private static void checkSorted(short[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   809
        for (int i = 0; i < a.length - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   810
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   811
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   812
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   813
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   814
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   815
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   816
    private static void checkSorted(byte[] a) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   817
        for (int i = 0; i < a.length - 1; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   818
            if (a[i] > a[i + 1]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   819
                failed(i, "" + a[i], "" + a[i + 1]);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   820
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   821
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   822
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   823
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   824
    private static void checkSorted(char[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   825
        for (int i = 0; i < a.length - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   826
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   827
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   828
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   829
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   830
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   831
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   832
    private static void checkSorted(float[] a) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   833
        for (int i = 0; i < a.length - 1; i++) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   834
            if (a[i] > a[i + 1]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   835
                failed(i, "" + a[i], "" + a[i + 1]);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   836
            }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   837
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   838
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   839
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   840
    private static void checkSorted(double[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   841
        for (int i = 0; i < a.length - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   842
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   843
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   844
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   845
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   846
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   847
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   848
    private static void checkCheckSum(Object test, Object golden) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   849
        if (checkSum(test) != checkSum(golden)) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   850
            failed("Original and sorted arrays seems not identical");
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   851
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   852
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   853
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   854
    private static int checkSum(Object object) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   855
        if (object instanceof int[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   856
            return checkSum((int[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   857
        } else if (object instanceof long[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   858
            return checkSum((long[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   859
        } else if (object instanceof short[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   860
            return checkSum((short[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   861
        } else if (object instanceof byte[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   862
            return checkSum((byte[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   863
        } else if (object instanceof char[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   864
            return checkSum((char[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   865
        } else if (object instanceof float[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   866
            return checkSum((float[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   867
        } else if (object instanceof double[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   868
            return checkSum((double[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   869
        } else {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   870
            failed("Unknow type of array: " + object + " of class " +
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   871
                object.getClass().getName());
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   872
            return -1;
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   873
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   874
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   875
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   876
    private static int checkSum(int[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   877
        int checkXorSum = 0;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   878
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   879
        for (int e : a) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   880
            checkXorSum ^= e;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   881
        }
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   882
        return checkXorSum;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   883
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   884
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   885
    private static int checkSum(long[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   886
        long checkXorSum = 0;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   887
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   888
        for (long e : a) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   889
            checkXorSum ^= e;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   890
        }
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   891
        return (int) checkXorSum;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   892
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   893
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   894
    private static int checkSum(short[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   895
        short checkXorSum = 0;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   896
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   897
        for (short e : a) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   898
            checkXorSum ^= e;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   899
        }
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   900
        return (int) checkXorSum;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   901
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   902
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   903
    private static int checkSum(byte[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   904
        byte checkXorSum = 0;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   905
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   906
        for (byte e : a) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   907
            checkXorSum ^= e;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   908
        }
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   909
        return (int) checkXorSum;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   910
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   911
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   912
    private static int checkSum(char[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   913
        char checkXorSum = 0;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   914
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   915
        for (char e : a) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   916
            checkXorSum ^= e;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   917
        }
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   918
        return (int) checkXorSum;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   919
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   920
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   921
    private static int checkSum(float[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   922
        int checkXorSum = 0;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   923
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   924
        for (float e : a) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   925
            checkXorSum ^= (int) e;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   926
        }
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   927
        return checkXorSum;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   928
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   929
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   930
    private static int checkSum(double[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   931
        int checkXorSum = 0;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   932
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   933
        for (double e : a) {
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   934
            checkXorSum ^= (int) e;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   935
        }
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   936
        return checkXorSum;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   937
    }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   938
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   939
    private static void sort(Object object) {
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   940
        if (object instanceof int[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   941
            Arrays.sort((int[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   942
        } else if (object instanceof long[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   943
            Arrays.sort((long[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   944
        } else if (object instanceof short[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   945
            Arrays.sort((short[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   946
        } else if (object instanceof byte[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   947
            Arrays.sort((byte[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   948
        } else if (object instanceof char[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   949
            Arrays.sort((char[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   950
        } else if (object instanceof float[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   951
            Arrays.sort((float[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   952
        } else if (object instanceof double[]) {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   953
            Arrays.sort((double[]) object);
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   954
        } else {
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   955
            failed("Unknow type of array: " + object + " of class " +
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   956
                object.getClass().getName());
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   957
        }
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
   958
    }
4233
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   959
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   960
    private static void sortSubArray(Object object, int fromIndex, int toIndex) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   961
        if (object instanceof int[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   962
            Arrays.sort((int[]) object, fromIndex, toIndex);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   963
        } else if (object instanceof long[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   964
            Arrays.sort((long[]) object, fromIndex, toIndex);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   965
        } else if (object instanceof short[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   966
            Arrays.sort((short[]) object, fromIndex, toIndex);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   967
        } else if (object instanceof byte[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   968
            Arrays.sort((byte[]) object, fromIndex, toIndex);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   969
        } else if (object instanceof char[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   970
            Arrays.sort((char[]) object, fromIndex, toIndex);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   971
        } else if (object instanceof float[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   972
            Arrays.sort((float[]) object, fromIndex, toIndex);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   973
        } else if (object instanceof double[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   974
            Arrays.sort((double[]) object, fromIndex, toIndex);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   975
        } else {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   976
            failed("Unknow type of array: " + object + " of class " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   977
                object.getClass().getName());
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   978
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   979
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   980
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   981
    private static void checkSubArray(Object object, int fromIndex, int toIndex, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   982
        if (object instanceof int[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   983
            checkSubArray((int[]) object, fromIndex, toIndex, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   984
        } else if (object instanceof long[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   985
            checkSubArray((long[]) object, fromIndex, toIndex, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   986
        } else if (object instanceof short[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   987
            checkSubArray((short[]) object, fromIndex, toIndex, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   988
        } else if (object instanceof byte[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   989
            checkSubArray((byte[]) object, fromIndex, toIndex, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   990
        } else if (object instanceof char[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   991
            checkSubArray((char[]) object, fromIndex, toIndex, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   992
        } else if (object instanceof float[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   993
            checkSubArray((float[]) object, fromIndex, toIndex, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   994
        } else if (object instanceof double[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   995
            checkSubArray((double[]) object, fromIndex, toIndex, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   996
        } else {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   997
            failed("Unknow type of array: " + object + " of class " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   998
                object.getClass().getName());
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
   999
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1000
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1001
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1002
    private static void checkSubArray(int[] a, int fromIndex, int toIndex, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1003
        for (int i = 0; i < fromIndex; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1004
            if (a[i] != 0xBABA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1005
                failed("Range sort changes left element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1006
                    ": " + a[i] + ", must be " + 0xBABA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1007
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1008
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1009
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1010
        for (int i = fromIndex; i < toIndex - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1011
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1012
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1013
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1014
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1015
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1016
        for (int i = toIndex; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1017
            if (a[i] != 0xDEDA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1018
                failed("Range sort changes right element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1019
                    ": " + a[i] + ", must be " + 0xDEDA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1020
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1021
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1022
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1023
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1024
    private static void checkSubArray(byte[] a, int fromIndex, int toIndex, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1025
        for (int i = 0; i < fromIndex; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1026
            if (a[i] != (byte) 0xBABA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1027
                failed("Range sort changes left element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1028
                    ": " + a[i] + ", must be " + 0xBABA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1029
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1030
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1031
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1032
        for (int i = fromIndex; i < toIndex - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1033
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1034
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1035
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1036
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1037
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1038
        for (int i = toIndex; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1039
            if (a[i] != (byte) 0xDEDA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1040
                failed("Range sort changes right element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1041
                    ": " + a[i] + ", must be " + 0xDEDA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1042
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1043
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1044
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1045
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1046
    private static void checkSubArray(long[] a, int fromIndex, int toIndex, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1047
        for (int i = 0; i < fromIndex; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1048
            if (a[i] != (long) 0xBABA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1049
                failed("Range sort changes left element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1050
                    ": " + a[i] + ", must be " + 0xBABA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1051
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1052
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1053
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1054
        for (int i = fromIndex; i < toIndex - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1055
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1056
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1057
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1058
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1059
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1060
        for (int i = toIndex; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1061
            if (a[i] != (long) 0xDEDA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1062
                failed("Range sort changes right element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1063
                    ": " + a[i] + ", must be " + 0xDEDA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1064
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1065
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1066
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1067
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1068
    private static void checkSubArray(char[] a, int fromIndex, int toIndex, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1069
        for (int i = 0; i < fromIndex; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1070
            if (a[i] != (char) 0xBABA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1071
                failed("Range sort changes left element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1072
                    ": " + a[i] + ", must be " + 0xBABA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1073
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1074
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1075
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1076
        for (int i = fromIndex; i < toIndex - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1077
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1078
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1079
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1080
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1081
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1082
        for (int i = toIndex; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1083
            if (a[i] != (char) 0xDEDA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1084
                failed("Range sort changes right element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1085
                    ": " + a[i] + ", must be " + 0xDEDA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1086
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1087
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1088
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1089
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1090
    private static void checkSubArray(short[] a, int fromIndex, int toIndex, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1091
        for (int i = 0; i < fromIndex; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1092
            if (a[i] != (short) 0xBABA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1093
                failed("Range sort changes left element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1094
                    ": " + a[i] + ", must be " + 0xBABA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1095
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1096
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1097
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1098
        for (int i = fromIndex; i < toIndex - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1099
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1100
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1101
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1102
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1103
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1104
        for (int i = toIndex; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1105
            if (a[i] != (short) 0xDEDA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1106
                failed("Range sort changes right element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1107
                    ": " + a[i] + ", must be " + 0xDEDA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1108
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1109
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1110
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1111
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1112
    private static void checkSubArray(float[] a, int fromIndex, int toIndex, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1113
        for (int i = 0; i < fromIndex; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1114
            if (a[i] != (float) 0xBABA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1115
                failed("Range sort changes left element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1116
                    ": " + a[i] + ", must be " + 0xBABA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1117
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1118
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1119
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1120
        for (int i = fromIndex; i < toIndex - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1121
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1122
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1123
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1124
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1125
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1126
        for (int i = toIndex; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1127
            if (a[i] != (float) 0xDEDA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1128
                failed("Range sort changes right element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1129
                    ": " + a[i] + ", must be " + 0xDEDA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1130
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1131
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1132
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1133
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1134
    private static void checkSubArray(double[] a, int fromIndex, int toIndex, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1135
        for (int i = 0; i < fromIndex; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1136
            if (a[i] != (double) 0xBABA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1137
                failed("Range sort changes left element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1138
                    ": " + a[i] + ", must be " + 0xBABA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1139
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1140
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1141
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1142
        for (int i = fromIndex; i < toIndex - 1; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1143
            if (a[i] > a[i + 1]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1144
                failed(i, "" + a[i], "" + a[i + 1]);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1145
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1146
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1147
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1148
        for (int i = toIndex; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1149
            if (a[i] != (double) 0xDEDA) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1150
                failed("Range sort changes right element on position " + i +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1151
                    ": " + a[i] + ", must be " + 0xDEDA);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1152
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1153
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1154
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1155
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1156
    private static void sortRange(Object object, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1157
        if (object instanceof int[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1158
            sortRange((int[]) object, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1159
        } else if (object instanceof long[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1160
            sortRange((long[]) object, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1161
        } else if (object instanceof short[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1162
            sortRange((short[]) object, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1163
        } else if (object instanceof byte[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1164
            sortRange((byte[]) object, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1165
        } else if (object instanceof char[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1166
            sortRange((char[]) object, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1167
        } else if (object instanceof float[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1168
            sortRange((float[]) object, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1169
        } else if (object instanceof double[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1170
            sortRange((double[]) object, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1171
        } else {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1172
            failed("Unknow type of array: " + object + " of class " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1173
                object.getClass().getName());
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1174
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1175
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1176
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1177
    private static void sortEmpty(Object object) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1178
        if (object instanceof int[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1179
            Arrays.sort(new int [] {});
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1180
        } else if (object instanceof long[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1181
            Arrays.sort(new long [] {});
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1182
        } else if (object instanceof short[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1183
            Arrays.sort(new short [] {});
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1184
        } else if (object instanceof byte[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1185
            Arrays.sort(new byte [] {});
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1186
        } else if (object instanceof char[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1187
            Arrays.sort(new char [] {});
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1188
        } else if (object instanceof float[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1189
            Arrays.sort(new float [] {});
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1190
        } else if (object instanceof double[]) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1191
            Arrays.sort(new double [] {});
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1192
        } else {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1193
            failed("Unknow type of array: " + object + " of class " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1194
                object.getClass().getName());
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1195
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1196
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1197
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1198
    private static void sortRange(int[] a, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1199
        try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1200
            Arrays.sort(a, m + 1, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1201
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1202
            failed("Sort does not throw IllegalArgumentException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1203
                " as expected: fromIndex = " + (m + 1) +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1204
                " toIndex = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1205
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1206
        catch (IllegalArgumentException iae) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1207
            try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1208
                Arrays.sort(a, -m, a.length);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1209
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1210
                failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1211
                    " as expected: fromIndex = " + (-m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1212
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1213
            catch (ArrayIndexOutOfBoundsException aoe) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1214
                try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1215
                    Arrays.sort(a, 0, a.length + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1216
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1217
                    failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1218
                        " as expected: toIndex = " + (a.length + m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1219
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1220
                catch (ArrayIndexOutOfBoundsException aie) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1221
                    return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1222
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1223
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1224
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1225
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1226
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1227
    private static void sortRange(long[] a, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1228
        try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1229
            Arrays.sort(a, m + 1, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1230
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1231
            failed("Sort does not throw IllegalArgumentException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1232
                " as expected: fromIndex = " + (m + 1) +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1233
                " toIndex = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1234
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1235
        catch (IllegalArgumentException iae) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1236
            try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1237
                Arrays.sort(a, -m, a.length);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1238
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1239
                failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1240
                    " as expected: fromIndex = " + (-m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1241
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1242
            catch (ArrayIndexOutOfBoundsException aoe) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1243
                try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1244
                    Arrays.sort(a, 0, a.length + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1245
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1246
                    failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1247
                        " as expected: toIndex = " + (a.length + m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1248
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1249
                catch (ArrayIndexOutOfBoundsException aie) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1250
                    return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1251
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1252
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1253
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1254
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1255
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1256
    private static void sortRange(byte[] a, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1257
        try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1258
            Arrays.sort(a, m + 1, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1259
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1260
            failed("Sort does not throw IllegalArgumentException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1261
                " as expected: fromIndex = " + (m + 1) +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1262
                " toIndex = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1263
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1264
        catch (IllegalArgumentException iae) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1265
            try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1266
                Arrays.sort(a, -m, a.length);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1267
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1268
                failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1269
                    " as expected: fromIndex = " + (-m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1270
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1271
            catch (ArrayIndexOutOfBoundsException aoe) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1272
                try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1273
                    Arrays.sort(a, 0, a.length + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1274
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1275
                    failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1276
                        " as expected: toIndex = " + (a.length + m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1277
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1278
                catch (ArrayIndexOutOfBoundsException aie) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1279
                    return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1280
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1281
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1282
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1283
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1284
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1285
    private static void sortRange(short[] a, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1286
        try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1287
            Arrays.sort(a, m + 1, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1288
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1289
            failed("Sort does not throw IllegalArgumentException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1290
                " as expected: fromIndex = " + (m + 1) +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1291
                " toIndex = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1292
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1293
        catch (IllegalArgumentException iae) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1294
            try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1295
                Arrays.sort(a, -m, a.length);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1296
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1297
                failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1298
                    " as expected: fromIndex = " + (-m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1299
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1300
            catch (ArrayIndexOutOfBoundsException aoe) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1301
                try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1302
                    Arrays.sort(a, 0, a.length + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1303
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1304
                    failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1305
                        " as expected: toIndex = " + (a.length + m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1306
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1307
                catch (ArrayIndexOutOfBoundsException aie) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1308
                    return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1309
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1310
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1311
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1312
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1313
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1314
    private static void sortRange(char[] a, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1315
        try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1316
            Arrays.sort(a, m + 1, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1317
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1318
            failed("Sort does not throw IllegalArgumentException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1319
                " as expected: fromIndex = " + (m + 1) +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1320
                " toIndex = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1321
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1322
        catch (IllegalArgumentException iae) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1323
            try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1324
                Arrays.sort(a, -m, a.length);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1325
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1326
                failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1327
                    " as expected: fromIndex = " + (-m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1328
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1329
            catch (ArrayIndexOutOfBoundsException aoe) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1330
                try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1331
                    Arrays.sort(a, 0, a.length + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1332
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1333
                    failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1334
                        " as expected: toIndex = " + (a.length + m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1335
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1336
                catch (ArrayIndexOutOfBoundsException aie) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1337
                    return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1338
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1339
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1340
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1341
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1342
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1343
    private static void sortRange(float[] a, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1344
        try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1345
            Arrays.sort(a, m + 1, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1346
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1347
            failed("Sort does not throw IllegalArgumentException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1348
                " as expected: fromIndex = " + (m + 1) +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1349
                " toIndex = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1350
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1351
        catch (IllegalArgumentException iae) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1352
            try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1353
                Arrays.sort(a, -m, a.length);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1354
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1355
                failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1356
                    " as expected: fromIndex = " + (-m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1357
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1358
            catch (ArrayIndexOutOfBoundsException aoe) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1359
                try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1360
                    Arrays.sort(a, 0, a.length + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1361
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1362
                    failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1363
                        " as expected: toIndex = " + (a.length + m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1364
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1365
                catch (ArrayIndexOutOfBoundsException aie) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1366
                    return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1367
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1368
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1369
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1370
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1371
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1372
    private static void sortRange(double[] a, int m) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1373
        try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1374
            Arrays.sort(a, m + 1, m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1375
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1376
            failed("Sort does not throw IllegalArgumentException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1377
                " as expected: fromIndex = " + (m + 1) +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1378
                " toIndex = " + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1379
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1380
        catch (IllegalArgumentException iae) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1381
            try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1382
                Arrays.sort(a, -m, a.length);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1383
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1384
                failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1385
                    " as expected: fromIndex = " + (-m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1386
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1387
            catch (ArrayIndexOutOfBoundsException aoe) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1388
                try {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1389
                    Arrays.sort(a, 0, a.length + m);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1390
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1391
                    failed("Sort does not throw ArrayIndexOutOfBoundsException " +
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1392
                        " as expected: toIndex = " + (a.length + m));
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1393
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1394
                catch (ArrayIndexOutOfBoundsException aie) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1395
                    return;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1396
                }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1397
            }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1398
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1399
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1400
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1401
    private static void prepareRandom(int[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1402
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1403
            a[i] = ourRandom.nextInt();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1404
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1405
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1406
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1407
    private static void reset(long seed) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1408
        ourRandom = new Random(seed);
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1409
        ourFirst = 0;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1410
        ourSecond = 0;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1411
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1412
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1413
    private static void outArr(int[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1414
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1415
            out.print(a[i] + " ");
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1416
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1417
        out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1418
        out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1419
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1420
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1421
    private static void outArr(float[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1422
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1423
            out.print(a[i] + " ");
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1424
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1425
        out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1426
        out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1427
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1428
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1429
    private static void outArr(double[] a) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1430
        for (int i = 0; i < a.length; i++) {
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1431
            out.print(a[i] + " ");
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1432
        }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1433
        out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1434
        out.println();
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1435
    }
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1436
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1437
    private static int ourFirst;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1438
    private static int ourSecond;
9b594a48d0f4 6899694: Dual-pivot quicksort improvements
alanb
parents: 4177
diff changeset
  1439
    private static Random ourRandom;
4177
208f8c11e7ba 6896573: Arrays.sort(long[]) fails with StackOverflowError
alanb
parents:
diff changeset
  1440
}