rt/emul/compact/src/main/java/java/util/DualPivotQuicksort.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 26 Feb 2013 16:54:16 +0100
changeset 772 d382dacfd73f
parent 559 emul/compact/src/main/java/java/util/DualPivotQuicksort.java@9ec5ddf175b5
permissions -rw-r--r--
Moving modules around so the runtime is under one master pom and can be built without building other modules that are in the repository
     1 /*
     2  * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    25 
    26 package java.util;
    27 
    28 /**
    29  * This class implements the Dual-Pivot Quicksort algorithm by
    30  * Vladimir Yaroslavskiy, Jon Bentley, and Josh Bloch. The algorithm
    31  * offers O(n log(n)) performance on many data sets that cause other
    32  * quicksorts to degrade to quadratic performance, and is typically
    33  * faster than traditional (one-pivot) Quicksort implementations.
    34  *
    35  * @author Vladimir Yaroslavskiy
    36  * @author Jon Bentley
    37  * @author Josh Bloch
    38  *
    39  * @version 2011.02.11 m765.827.12i:5\7pm
    40  * @since 1.7
    41  */
    42 final class DualPivotQuicksort {
    43 
    44     /**
    45      * Prevents instantiation.
    46      */
    47     private DualPivotQuicksort() {}
    48 
    49     /*
    50      * Tuning parameters.
    51      */
    52 
    53     /**
    54      * The maximum number of runs in merge sort.
    55      */
    56     private static final int MAX_RUN_COUNT = 67;
    57 
    58     /**
    59      * The maximum length of run in merge sort.
    60      */
    61     private static final int MAX_RUN_LENGTH = 33;
    62 
    63     /**
    64      * If the length of an array to be sorted is less than this
    65      * constant, Quicksort is used in preference to merge sort.
    66      */
    67     private static final int QUICKSORT_THRESHOLD = 286;
    68 
    69     /**
    70      * If the length of an array to be sorted is less than this
    71      * constant, insertion sort is used in preference to Quicksort.
    72      */
    73     private static final int INSERTION_SORT_THRESHOLD = 47;
    74 
    75     /**
    76      * If the length of a byte array to be sorted is greater than this
    77      * constant, counting sort is used in preference to insertion sort.
    78      */
    79     private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 29;
    80 
    81     /**
    82      * If the length of a short or char array to be sorted is greater
    83      * than this constant, counting sort is used in preference to Quicksort.
    84      */
    85     private static final int COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR = 3200;
    86 
    87     /*
    88      * Sorting methods for seven primitive types.
    89      */
    90 
    91     /**
    92      * Sorts the specified array.
    93      *
    94      * @param a the array to be sorted
    95      */
    96     public static void sort(int[] a) {
    97         sort(a, 0, a.length - 1);
    98     }
    99 
   100     /**
   101      * Sorts the specified range of the array.
   102      *
   103      * @param a the array to be sorted
   104      * @param left the index of the first element, inclusive, to be sorted
   105      * @param right the index of the last element, inclusive, to be sorted
   106      */
   107     public static void sort(int[] a, int left, int right) {
   108         // Use Quicksort on small arrays
   109         if (right - left < QUICKSORT_THRESHOLD) {
   110             sort(a, left, right, true);
   111             return;
   112         }
   113 
   114         /*
   115          * Index run[i] is the start of i-th run
   116          * (ascending or descending sequence).
   117          */
   118         int[] run = new int[MAX_RUN_COUNT + 1];
   119         int count = 0; run[0] = left;
   120 
   121         // Check if the array is nearly sorted
   122         for (int k = left; k < right; run[count] = k) {
   123             if (a[k] < a[k + 1]) { // ascending
   124                 while (++k <= right && a[k - 1] <= a[k]);
   125             } else if (a[k] > a[k + 1]) { // descending
   126                 while (++k <= right && a[k - 1] >= a[k]);
   127                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
   128                     int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
   129                 }
   130             } else { // equal
   131                 for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
   132                     if (--m == 0) {
   133                         sort(a, left, right, true);
   134                         return;
   135                     }
   136                 }
   137             }
   138 
   139             /*
   140              * The array is not highly structured,
   141              * use Quicksort instead of merge sort.
   142              */
   143             if (++count == MAX_RUN_COUNT) {
   144                 sort(a, left, right, true);
   145                 return;
   146             }
   147         }
   148 
   149         // Check special cases
   150         if (run[count] == right++) { // The last run contains one element
   151             run[++count] = right;
   152         } else if (count == 1) { // The array is already sorted
   153             return;
   154         }
   155 
   156         /*
   157          * Create temporary array, which is used for merging.
   158          * Implementation note: variable "right" is increased by 1.
   159          */
   160         int[] b; byte odd = 0;
   161         for (int n = 1; (n <<= 1) < count; odd ^= 1);
   162 
   163         if (odd == 0) {
   164             b = a; a = new int[b.length];
   165             for (int i = left - 1; ++i < right; a[i] = b[i]);
   166         } else {
   167             b = new int[a.length];
   168         }
   169 
   170         // Merging
   171         for (int last; count > 1; count = last) {
   172             for (int k = (last = 0) + 2; k <= count; k += 2) {
   173                 int hi = run[k], mi = run[k - 1];
   174                 for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
   175                     if (q >= hi || p < mi && a[p] <= a[q]) {
   176                         b[i] = a[p++];
   177                     } else {
   178                         b[i] = a[q++];
   179                     }
   180                 }
   181                 run[++last] = hi;
   182             }
   183             if ((count & 1) != 0) {
   184                 for (int i = right, lo = run[count - 1]; --i >= lo;
   185                     b[i] = a[i]
   186                 );
   187                 run[++last] = right;
   188             }
   189             int[] t = a; a = b; b = t;
   190         }
   191     }
   192 
   193     /**
   194      * Sorts the specified range of the array by Dual-Pivot Quicksort.
   195      *
   196      * @param a the array to be sorted
   197      * @param left the index of the first element, inclusive, to be sorted
   198      * @param right the index of the last element, inclusive, to be sorted
   199      * @param leftmost indicates if this part is the leftmost in the range
   200      */
   201     private static void sort(int[] a, int left, int right, boolean leftmost) {
   202         int length = right - left + 1;
   203 
   204         // Use insertion sort on tiny arrays
   205         if (length < INSERTION_SORT_THRESHOLD) {
   206             if (leftmost) {
   207                 /*
   208                  * Traditional (without sentinel) insertion sort,
   209                  * optimized for server VM, is used in case of
   210                  * the leftmost part.
   211                  */
   212                 for (int i = left, j = i; i < right; j = ++i) {
   213                     int ai = a[i + 1];
   214                     while (ai < a[j]) {
   215                         a[j + 1] = a[j];
   216                         if (j-- == left) {
   217                             break;
   218                         }
   219                     }
   220                     a[j + 1] = ai;
   221                 }
   222             } else {
   223                 /*
   224                  * Skip the longest ascending sequence.
   225                  */
   226                 do {
   227                     if (left >= right) {
   228                         return;
   229                     }
   230                 } while (a[++left] >= a[left - 1]);
   231 
   232                 /*
   233                  * Every element from adjoining part plays the role
   234                  * of sentinel, therefore this allows us to avoid the
   235                  * left range check on each iteration. Moreover, we use
   236                  * the more optimized algorithm, so called pair insertion
   237                  * sort, which is faster (in the context of Quicksort)
   238                  * than traditional implementation of insertion sort.
   239                  */
   240                 for (int k = left; ++left <= right; k = ++left) {
   241                     int a1 = a[k], a2 = a[left];
   242 
   243                     if (a1 < a2) {
   244                         a2 = a1; a1 = a[left];
   245                     }
   246                     while (a1 < a[--k]) {
   247                         a[k + 2] = a[k];
   248                     }
   249                     a[++k + 1] = a1;
   250 
   251                     while (a2 < a[--k]) {
   252                         a[k + 1] = a[k];
   253                     }
   254                     a[k + 1] = a2;
   255                 }
   256                 int last = a[right];
   257 
   258                 while (last < a[--right]) {
   259                     a[right + 1] = a[right];
   260                 }
   261                 a[right + 1] = last;
   262             }
   263             return;
   264         }
   265 
   266         // Inexpensive approximation of length / 7
   267         int seventh = (length >> 3) + (length >> 6) + 1;
   268 
   269         /*
   270          * Sort five evenly spaced elements around (and including) the
   271          * center element in the range. These elements will be used for
   272          * pivot selection as described below. The choice for spacing
   273          * these elements was empirically determined to work well on
   274          * a wide variety of inputs.
   275          */
   276         int e3 = (left + right) >>> 1; // The midpoint
   277         int e2 = e3 - seventh;
   278         int e1 = e2 - seventh;
   279         int e4 = e3 + seventh;
   280         int e5 = e4 + seventh;
   281 
   282         // Sort these elements using insertion sort
   283         if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
   284 
   285         if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t;
   286             if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
   287         }
   288         if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t;
   289             if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
   290                 if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
   291             }
   292         }
   293         if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t;
   294             if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
   295                 if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
   296                     if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
   297                 }
   298             }
   299         }
   300 
   301         // Pointers
   302         int less  = left;  // The index of the first element of center part
   303         int great = right; // The index before the first element of right part
   304 
   305         if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
   306             /*
   307              * Use the second and fourth of the five sorted elements as pivots.
   308              * These values are inexpensive approximations of the first and
   309              * second terciles of the array. Note that pivot1 <= pivot2.
   310              */
   311             int pivot1 = a[e2];
   312             int pivot2 = a[e4];
   313 
   314             /*
   315              * The first and the last elements to be sorted are moved to the
   316              * locations formerly occupied by the pivots. When partitioning
   317              * is complete, the pivots are swapped back into their final
   318              * positions, and excluded from subsequent sorting.
   319              */
   320             a[e2] = a[left];
   321             a[e4] = a[right];
   322 
   323             /*
   324              * Skip elements, which are less or greater than pivot values.
   325              */
   326             while (a[++less] < pivot1);
   327             while (a[--great] > pivot2);
   328 
   329             /*
   330              * Partitioning:
   331              *
   332              *   left part           center part                   right part
   333              * +--------------------------------------------------------------+
   334              * |  < pivot1  |  pivot1 <= && <= pivot2  |    ?    |  > pivot2  |
   335              * +--------------------------------------------------------------+
   336              *               ^                          ^       ^
   337              *               |                          |       |
   338              *              less                        k     great
   339              *
   340              * Invariants:
   341              *
   342              *              all in (left, less)   < pivot1
   343              *    pivot1 <= all in [less, k)     <= pivot2
   344              *              all in (great, right) > pivot2
   345              *
   346              * Pointer k is the first index of ?-part.
   347              */
   348             outer:
   349             for (int k = less - 1; ++k <= great; ) {
   350                 int ak = a[k];
   351                 if (ak < pivot1) { // Move a[k] to left part
   352                     a[k] = a[less];
   353                     /*
   354                      * Here and below we use "a[i] = b; i++;" instead
   355                      * of "a[i++] = b;" due to performance issue.
   356                      */
   357                     a[less] = ak;
   358                     ++less;
   359                 } else if (ak > pivot2) { // Move a[k] to right part
   360                     while (a[great] > pivot2) {
   361                         if (great-- == k) {
   362                             break outer;
   363                         }
   364                     }
   365                     if (a[great] < pivot1) { // a[great] <= pivot2
   366                         a[k] = a[less];
   367                         a[less] = a[great];
   368                         ++less;
   369                     } else { // pivot1 <= a[great] <= pivot2
   370                         a[k] = a[great];
   371                     }
   372                     /*
   373                      * Here and below we use "a[i] = b; i--;" instead
   374                      * of "a[i--] = b;" due to performance issue.
   375                      */
   376                     a[great] = ak;
   377                     --great;
   378                 }
   379             }
   380 
   381             // Swap pivots into their final positions
   382             a[left]  = a[less  - 1]; a[less  - 1] = pivot1;
   383             a[right] = a[great + 1]; a[great + 1] = pivot2;
   384 
   385             // Sort left and right parts recursively, excluding known pivots
   386             sort(a, left, less - 2, leftmost);
   387             sort(a, great + 2, right, false);
   388 
   389             /*
   390              * If center part is too large (comprises > 4/7 of the array),
   391              * swap internal pivot values to ends.
   392              */
   393             if (less < e1 && e5 < great) {
   394                 /*
   395                  * Skip elements, which are equal to pivot values.
   396                  */
   397                 while (a[less] == pivot1) {
   398                     ++less;
   399                 }
   400 
   401                 while (a[great] == pivot2) {
   402                     --great;
   403                 }
   404 
   405                 /*
   406                  * Partitioning:
   407                  *
   408                  *   left part         center part                  right part
   409                  * +----------------------------------------------------------+
   410                  * | == pivot1 |  pivot1 < && < pivot2  |    ?    | == pivot2 |
   411                  * +----------------------------------------------------------+
   412                  *              ^                        ^       ^
   413                  *              |                        |       |
   414                  *             less                      k     great
   415                  *
   416                  * Invariants:
   417                  *
   418                  *              all in (*,  less) == pivot1
   419                  *     pivot1 < all in [less,  k)  < pivot2
   420                  *              all in (great, *) == pivot2
   421                  *
   422                  * Pointer k is the first index of ?-part.
   423                  */
   424                 outer:
   425                 for (int k = less - 1; ++k <= great; ) {
   426                     int ak = a[k];
   427                     if (ak == pivot1) { // Move a[k] to left part
   428                         a[k] = a[less];
   429                         a[less] = ak;
   430                         ++less;
   431                     } else if (ak == pivot2) { // Move a[k] to right part
   432                         while (a[great] == pivot2) {
   433                             if (great-- == k) {
   434                                 break outer;
   435                             }
   436                         }
   437                         if (a[great] == pivot1) { // a[great] < pivot2
   438                             a[k] = a[less];
   439                             /*
   440                              * Even though a[great] equals to pivot1, the
   441                              * assignment a[less] = pivot1 may be incorrect,
   442                              * if a[great] and pivot1 are floating-point zeros
   443                              * of different signs. Therefore in float and
   444                              * double sorting methods we have to use more
   445                              * accurate assignment a[less] = a[great].
   446                              */
   447                             a[less] = pivot1;
   448                             ++less;
   449                         } else { // pivot1 < a[great] < pivot2
   450                             a[k] = a[great];
   451                         }
   452                         a[great] = ak;
   453                         --great;
   454                     }
   455                 }
   456             }
   457 
   458             // Sort center part recursively
   459             sort(a, less, great, false);
   460 
   461         } else { // Partitioning with one pivot
   462             /*
   463              * Use the third of the five sorted elements as pivot.
   464              * This value is inexpensive approximation of the median.
   465              */
   466             int pivot = a[e3];
   467 
   468             /*
   469              * Partitioning degenerates to the traditional 3-way
   470              * (or "Dutch National Flag") schema:
   471              *
   472              *   left part    center part              right part
   473              * +-------------------------------------------------+
   474              * |  < pivot  |   == pivot   |     ?    |  > pivot  |
   475              * +-------------------------------------------------+
   476              *              ^              ^        ^
   477              *              |              |        |
   478              *             less            k      great
   479              *
   480              * Invariants:
   481              *
   482              *   all in (left, less)   < pivot
   483              *   all in [less, k)     == pivot
   484              *   all in (great, right) > pivot
   485              *
   486              * Pointer k is the first index of ?-part.
   487              */
   488             for (int k = less; k <= great; ++k) {
   489                 if (a[k] == pivot) {
   490                     continue;
   491                 }
   492                 int ak = a[k];
   493                 if (ak < pivot) { // Move a[k] to left part
   494                     a[k] = a[less];
   495                     a[less] = ak;
   496                     ++less;
   497                 } else { // a[k] > pivot - Move a[k] to right part
   498                     while (a[great] > pivot) {
   499                         --great;
   500                     }
   501                     if (a[great] < pivot) { // a[great] <= pivot
   502                         a[k] = a[less];
   503                         a[less] = a[great];
   504                         ++less;
   505                     } else { // a[great] == pivot
   506                         /*
   507                          * Even though a[great] equals to pivot, the
   508                          * assignment a[k] = pivot may be incorrect,
   509                          * if a[great] and pivot are floating-point
   510                          * zeros of different signs. Therefore in float
   511                          * and double sorting methods we have to use
   512                          * more accurate assignment a[k] = a[great].
   513                          */
   514                         a[k] = pivot;
   515                     }
   516                     a[great] = ak;
   517                     --great;
   518                 }
   519             }
   520 
   521             /*
   522              * Sort left and right parts recursively.
   523              * All elements from center part are equal
   524              * and, therefore, already sorted.
   525              */
   526             sort(a, left, less - 1, leftmost);
   527             sort(a, great + 1, right, false);
   528         }
   529     }
   530 
   531     /**
   532      * Sorts the specified array.
   533      *
   534      * @param a the array to be sorted
   535      */
   536     public static void sort(long[] a) {
   537         sort(a, 0, a.length - 1);
   538     }
   539 
   540     /**
   541      * Sorts the specified range of the array.
   542      *
   543      * @param a the array to be sorted
   544      * @param left the index of the first element, inclusive, to be sorted
   545      * @param right the index of the last element, inclusive, to be sorted
   546      */
   547     public static void sort(long[] a, int left, int right) {
   548         // Use Quicksort on small arrays
   549         if (right - left < QUICKSORT_THRESHOLD) {
   550             sort(a, left, right, true);
   551             return;
   552         }
   553 
   554         /*
   555          * Index run[i] is the start of i-th run
   556          * (ascending or descending sequence).
   557          */
   558         int[] run = new int[MAX_RUN_COUNT + 1];
   559         int count = 0; run[0] = left;
   560 
   561         // Check if the array is nearly sorted
   562         for (int k = left; k < right; run[count] = k) {
   563             if (a[k] < a[k + 1]) { // ascending
   564                 while (++k <= right && a[k - 1] <= a[k]);
   565             } else if (a[k] > a[k + 1]) { // descending
   566                 while (++k <= right && a[k - 1] >= a[k]);
   567                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
   568                     long t = a[lo]; a[lo] = a[hi]; a[hi] = t;
   569                 }
   570             } else { // equal
   571                 for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
   572                     if (--m == 0) {
   573                         sort(a, left, right, true);
   574                         return;
   575                     }
   576                 }
   577             }
   578 
   579             /*
   580              * The array is not highly structured,
   581              * use Quicksort instead of merge sort.
   582              */
   583             if (++count == MAX_RUN_COUNT) {
   584                 sort(a, left, right, true);
   585                 return;
   586             }
   587         }
   588 
   589         // Check special cases
   590         if (run[count] == right++) { // The last run contains one element
   591             run[++count] = right;
   592         } else if (count == 1) { // The array is already sorted
   593             return;
   594         }
   595 
   596         /*
   597          * Create temporary array, which is used for merging.
   598          * Implementation note: variable "right" is increased by 1.
   599          */
   600         long[] b; byte odd = 0;
   601         for (int n = 1; (n <<= 1) < count; odd ^= 1);
   602 
   603         if (odd == 0) {
   604             b = a; a = new long[b.length];
   605             for (int i = left - 1; ++i < right; a[i] = b[i]);
   606         } else {
   607             b = new long[a.length];
   608         }
   609 
   610         // Merging
   611         for (int last; count > 1; count = last) {
   612             for (int k = (last = 0) + 2; k <= count; k += 2) {
   613                 int hi = run[k], mi = run[k - 1];
   614                 for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
   615                     if (q >= hi || p < mi && a[p] <= a[q]) {
   616                         b[i] = a[p++];
   617                     } else {
   618                         b[i] = a[q++];
   619                     }
   620                 }
   621                 run[++last] = hi;
   622             }
   623             if ((count & 1) != 0) {
   624                 for (int i = right, lo = run[count - 1]; --i >= lo;
   625                     b[i] = a[i]
   626                 );
   627                 run[++last] = right;
   628             }
   629             long[] t = a; a = b; b = t;
   630         }
   631     }
   632 
   633     /**
   634      * Sorts the specified range of the array by Dual-Pivot Quicksort.
   635      *
   636      * @param a the array to be sorted
   637      * @param left the index of the first element, inclusive, to be sorted
   638      * @param right the index of the last element, inclusive, to be sorted
   639      * @param leftmost indicates if this part is the leftmost in the range
   640      */
   641     private static void sort(long[] a, int left, int right, boolean leftmost) {
   642         int length = right - left + 1;
   643 
   644         // Use insertion sort on tiny arrays
   645         if (length < INSERTION_SORT_THRESHOLD) {
   646             if (leftmost) {
   647                 /*
   648                  * Traditional (without sentinel) insertion sort,
   649                  * optimized for server VM, is used in case of
   650                  * the leftmost part.
   651                  */
   652                 for (int i = left, j = i; i < right; j = ++i) {
   653                     long ai = a[i + 1];
   654                     while (ai < a[j]) {
   655                         a[j + 1] = a[j];
   656                         if (j-- == left) {
   657                             break;
   658                         }
   659                     }
   660                     a[j + 1] = ai;
   661                 }
   662             } else {
   663                 /*
   664                  * Skip the longest ascending sequence.
   665                  */
   666                 do {
   667                     if (left >= right) {
   668                         return;
   669                     }
   670                 } while (a[++left] >= a[left - 1]);
   671 
   672                 /*
   673                  * Every element from adjoining part plays the role
   674                  * of sentinel, therefore this allows us to avoid the
   675                  * left range check on each iteration. Moreover, we use
   676                  * the more optimized algorithm, so called pair insertion
   677                  * sort, which is faster (in the context of Quicksort)
   678                  * than traditional implementation of insertion sort.
   679                  */
   680                 for (int k = left; ++left <= right; k = ++left) {
   681                     long a1 = a[k], a2 = a[left];
   682 
   683                     if (a1 < a2) {
   684                         a2 = a1; a1 = a[left];
   685                     }
   686                     while (a1 < a[--k]) {
   687                         a[k + 2] = a[k];
   688                     }
   689                     a[++k + 1] = a1;
   690 
   691                     while (a2 < a[--k]) {
   692                         a[k + 1] = a[k];
   693                     }
   694                     a[k + 1] = a2;
   695                 }
   696                 long last = a[right];
   697 
   698                 while (last < a[--right]) {
   699                     a[right + 1] = a[right];
   700                 }
   701                 a[right + 1] = last;
   702             }
   703             return;
   704         }
   705 
   706         // Inexpensive approximation of length / 7
   707         int seventh = (length >> 3) + (length >> 6) + 1;
   708 
   709         /*
   710          * Sort five evenly spaced elements around (and including) the
   711          * center element in the range. These elements will be used for
   712          * pivot selection as described below. The choice for spacing
   713          * these elements was empirically determined to work well on
   714          * a wide variety of inputs.
   715          */
   716         int e3 = (left + right) >>> 1; // The midpoint
   717         int e2 = e3 - seventh;
   718         int e1 = e2 - seventh;
   719         int e4 = e3 + seventh;
   720         int e5 = e4 + seventh;
   721 
   722         // Sort these elements using insertion sort
   723         if (a[e2] < a[e1]) { long t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
   724 
   725         if (a[e3] < a[e2]) { long t = a[e3]; a[e3] = a[e2]; a[e2] = t;
   726             if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
   727         }
   728         if (a[e4] < a[e3]) { long t = a[e4]; a[e4] = a[e3]; a[e3] = t;
   729             if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
   730                 if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
   731             }
   732         }
   733         if (a[e5] < a[e4]) { long t = a[e5]; a[e5] = a[e4]; a[e4] = t;
   734             if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
   735                 if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
   736                     if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
   737                 }
   738             }
   739         }
   740 
   741         // Pointers
   742         int less  = left;  // The index of the first element of center part
   743         int great = right; // The index before the first element of right part
   744 
   745         if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
   746             /*
   747              * Use the second and fourth of the five sorted elements as pivots.
   748              * These values are inexpensive approximations of the first and
   749              * second terciles of the array. Note that pivot1 <= pivot2.
   750              */
   751             long pivot1 = a[e2];
   752             long pivot2 = a[e4];
   753 
   754             /*
   755              * The first and the last elements to be sorted are moved to the
   756              * locations formerly occupied by the pivots. When partitioning
   757              * is complete, the pivots are swapped back into their final
   758              * positions, and excluded from subsequent sorting.
   759              */
   760             a[e2] = a[left];
   761             a[e4] = a[right];
   762 
   763             /*
   764              * Skip elements, which are less or greater than pivot values.
   765              */
   766             while (a[++less] < pivot1);
   767             while (a[--great] > pivot2);
   768 
   769             /*
   770              * Partitioning:
   771              *
   772              *   left part           center part                   right part
   773              * +--------------------------------------------------------------+
   774              * |  < pivot1  |  pivot1 <= && <= pivot2  |    ?    |  > pivot2  |
   775              * +--------------------------------------------------------------+
   776              *               ^                          ^       ^
   777              *               |                          |       |
   778              *              less                        k     great
   779              *
   780              * Invariants:
   781              *
   782              *              all in (left, less)   < pivot1
   783              *    pivot1 <= all in [less, k)     <= pivot2
   784              *              all in (great, right) > pivot2
   785              *
   786              * Pointer k is the first index of ?-part.
   787              */
   788             outer:
   789             for (int k = less - 1; ++k <= great; ) {
   790                 long ak = a[k];
   791                 if (ak < pivot1) { // Move a[k] to left part
   792                     a[k] = a[less];
   793                     /*
   794                      * Here and below we use "a[i] = b; i++;" instead
   795                      * of "a[i++] = b;" due to performance issue.
   796                      */
   797                     a[less] = ak;
   798                     ++less;
   799                 } else if (ak > pivot2) { // Move a[k] to right part
   800                     while (a[great] > pivot2) {
   801                         if (great-- == k) {
   802                             break outer;
   803                         }
   804                     }
   805                     if (a[great] < pivot1) { // a[great] <= pivot2
   806                         a[k] = a[less];
   807                         a[less] = a[great];
   808                         ++less;
   809                     } else { // pivot1 <= a[great] <= pivot2
   810                         a[k] = a[great];
   811                     }
   812                     /*
   813                      * Here and below we use "a[i] = b; i--;" instead
   814                      * of "a[i--] = b;" due to performance issue.
   815                      */
   816                     a[great] = ak;
   817                     --great;
   818                 }
   819             }
   820 
   821             // Swap pivots into their final positions
   822             a[left]  = a[less  - 1]; a[less  - 1] = pivot1;
   823             a[right] = a[great + 1]; a[great + 1] = pivot2;
   824 
   825             // Sort left and right parts recursively, excluding known pivots
   826             sort(a, left, less - 2, leftmost);
   827             sort(a, great + 2, right, false);
   828 
   829             /*
   830              * If center part is too large (comprises > 4/7 of the array),
   831              * swap internal pivot values to ends.
   832              */
   833             if (less < e1 && e5 < great) {
   834                 /*
   835                  * Skip elements, which are equal to pivot values.
   836                  */
   837                 while (a[less] == pivot1) {
   838                     ++less;
   839                 }
   840 
   841                 while (a[great] == pivot2) {
   842                     --great;
   843                 }
   844 
   845                 /*
   846                  * Partitioning:
   847                  *
   848                  *   left part         center part                  right part
   849                  * +----------------------------------------------------------+
   850                  * | == pivot1 |  pivot1 < && < pivot2  |    ?    | == pivot2 |
   851                  * +----------------------------------------------------------+
   852                  *              ^                        ^       ^
   853                  *              |                        |       |
   854                  *             less                      k     great
   855                  *
   856                  * Invariants:
   857                  *
   858                  *              all in (*,  less) == pivot1
   859                  *     pivot1 < all in [less,  k)  < pivot2
   860                  *              all in (great, *) == pivot2
   861                  *
   862                  * Pointer k is the first index of ?-part.
   863                  */
   864                 outer:
   865                 for (int k = less - 1; ++k <= great; ) {
   866                     long ak = a[k];
   867                     if (ak == pivot1) { // Move a[k] to left part
   868                         a[k] = a[less];
   869                         a[less] = ak;
   870                         ++less;
   871                     } else if (ak == pivot2) { // Move a[k] to right part
   872                         while (a[great] == pivot2) {
   873                             if (great-- == k) {
   874                                 break outer;
   875                             }
   876                         }
   877                         if (a[great] == pivot1) { // a[great] < pivot2
   878                             a[k] = a[less];
   879                             /*
   880                              * Even though a[great] equals to pivot1, the
   881                              * assignment a[less] = pivot1 may be incorrect,
   882                              * if a[great] and pivot1 are floating-point zeros
   883                              * of different signs. Therefore in float and
   884                              * double sorting methods we have to use more
   885                              * accurate assignment a[less] = a[great].
   886                              */
   887                             a[less] = pivot1;
   888                             ++less;
   889                         } else { // pivot1 < a[great] < pivot2
   890                             a[k] = a[great];
   891                         }
   892                         a[great] = ak;
   893                         --great;
   894                     }
   895                 }
   896             }
   897 
   898             // Sort center part recursively
   899             sort(a, less, great, false);
   900 
   901         } else { // Partitioning with one pivot
   902             /*
   903              * Use the third of the five sorted elements as pivot.
   904              * This value is inexpensive approximation of the median.
   905              */
   906             long pivot = a[e3];
   907 
   908             /*
   909              * Partitioning degenerates to the traditional 3-way
   910              * (or "Dutch National Flag") schema:
   911              *
   912              *   left part    center part              right part
   913              * +-------------------------------------------------+
   914              * |  < pivot  |   == pivot   |     ?    |  > pivot  |
   915              * +-------------------------------------------------+
   916              *              ^              ^        ^
   917              *              |              |        |
   918              *             less            k      great
   919              *
   920              * Invariants:
   921              *
   922              *   all in (left, less)   < pivot
   923              *   all in [less, k)     == pivot
   924              *   all in (great, right) > pivot
   925              *
   926              * Pointer k is the first index of ?-part.
   927              */
   928             for (int k = less; k <= great; ++k) {
   929                 if (a[k] == pivot) {
   930                     continue;
   931                 }
   932                 long ak = a[k];
   933                 if (ak < pivot) { // Move a[k] to left part
   934                     a[k] = a[less];
   935                     a[less] = ak;
   936                     ++less;
   937                 } else { // a[k] > pivot - Move a[k] to right part
   938                     while (a[great] > pivot) {
   939                         --great;
   940                     }
   941                     if (a[great] < pivot) { // a[great] <= pivot
   942                         a[k] = a[less];
   943                         a[less] = a[great];
   944                         ++less;
   945                     } else { // a[great] == pivot
   946                         /*
   947                          * Even though a[great] equals to pivot, the
   948                          * assignment a[k] = pivot may be incorrect,
   949                          * if a[great] and pivot are floating-point
   950                          * zeros of different signs. Therefore in float
   951                          * and double sorting methods we have to use
   952                          * more accurate assignment a[k] = a[great].
   953                          */
   954                         a[k] = pivot;
   955                     }
   956                     a[great] = ak;
   957                     --great;
   958                 }
   959             }
   960 
   961             /*
   962              * Sort left and right parts recursively.
   963              * All elements from center part are equal
   964              * and, therefore, already sorted.
   965              */
   966             sort(a, left, less - 1, leftmost);
   967             sort(a, great + 1, right, false);
   968         }
   969     }
   970 
   971     /**
   972      * Sorts the specified array.
   973      *
   974      * @param a the array to be sorted
   975      */
   976     public static void sort(short[] a) {
   977         sort(a, 0, a.length - 1);
   978     }
   979 
   980     /**
   981      * Sorts the specified range of the array.
   982      *
   983      * @param a the array to be sorted
   984      * @param left the index of the first element, inclusive, to be sorted
   985      * @param right the index of the last element, inclusive, to be sorted
   986      */
   987     public static void sort(short[] a, int left, int right) {
   988         // Use counting sort on large arrays
   989         if (right - left > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) {
   990             int[] count = new int[NUM_SHORT_VALUES];
   991 
   992             for (int i = left - 1; ++i <= right;
   993                 count[a[i] - Short.MIN_VALUE]++
   994             );
   995             for (int i = NUM_SHORT_VALUES, k = right + 1; k > left; ) {
   996                 while (count[--i] == 0);
   997                 short value = (short) (i + Short.MIN_VALUE);
   998                 int s = count[i];
   999 
  1000                 do {
  1001                     a[--k] = value;
  1002                 } while (--s > 0);
  1003             }
  1004         } else { // Use Dual-Pivot Quicksort on small arrays
  1005             doSort(a, left, right);
  1006         }
  1007     }
  1008 
  1009     /** The number of distinct short values. */
  1010     private static final int NUM_SHORT_VALUES = 1 << 16;
  1011 
  1012     /**
  1013      * Sorts the specified range of the array.
  1014      *
  1015      * @param a the array to be sorted
  1016      * @param left the index of the first element, inclusive, to be sorted
  1017      * @param right the index of the last element, inclusive, to be sorted
  1018      */
  1019     private static void doSort(short[] a, int left, int right) {
  1020         // Use Quicksort on small arrays
  1021         if (right - left < QUICKSORT_THRESHOLD) {
  1022             sort(a, left, right, true);
  1023             return;
  1024         }
  1025 
  1026         /*
  1027          * Index run[i] is the start of i-th run
  1028          * (ascending or descending sequence).
  1029          */
  1030         int[] run = new int[MAX_RUN_COUNT + 1];
  1031         int count = 0; run[0] = left;
  1032 
  1033         // Check if the array is nearly sorted
  1034         for (int k = left; k < right; run[count] = k) {
  1035             if (a[k] < a[k + 1]) { // ascending
  1036                 while (++k <= right && a[k - 1] <= a[k]);
  1037             } else if (a[k] > a[k + 1]) { // descending
  1038                 while (++k <= right && a[k - 1] >= a[k]);
  1039                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
  1040                     short t = a[lo]; a[lo] = a[hi]; a[hi] = t;
  1041                 }
  1042             } else { // equal
  1043                 for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
  1044                     if (--m == 0) {
  1045                         sort(a, left, right, true);
  1046                         return;
  1047                     }
  1048                 }
  1049             }
  1050 
  1051             /*
  1052              * The array is not highly structured,
  1053              * use Quicksort instead of merge sort.
  1054              */
  1055             if (++count == MAX_RUN_COUNT) {
  1056                 sort(a, left, right, true);
  1057                 return;
  1058             }
  1059         }
  1060 
  1061         // Check special cases
  1062         if (run[count] == right++) { // The last run contains one element
  1063             run[++count] = right;
  1064         } else if (count == 1) { // The array is already sorted
  1065             return;
  1066         }
  1067 
  1068         /*
  1069          * Create temporary array, which is used for merging.
  1070          * Implementation note: variable "right" is increased by 1.
  1071          */
  1072         short[] b; byte odd = 0;
  1073         for (int n = 1; (n <<= 1) < count; odd ^= 1);
  1074 
  1075         if (odd == 0) {
  1076             b = a; a = new short[b.length];
  1077             for (int i = left - 1; ++i < right; a[i] = b[i]);
  1078         } else {
  1079             b = new short[a.length];
  1080         }
  1081 
  1082         // Merging
  1083         for (int last; count > 1; count = last) {
  1084             for (int k = (last = 0) + 2; k <= count; k += 2) {
  1085                 int hi = run[k], mi = run[k - 1];
  1086                 for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
  1087                     if (q >= hi || p < mi && a[p] <= a[q]) {
  1088                         b[i] = a[p++];
  1089                     } else {
  1090                         b[i] = a[q++];
  1091                     }
  1092                 }
  1093                 run[++last] = hi;
  1094             }
  1095             if ((count & 1) != 0) {
  1096                 for (int i = right, lo = run[count - 1]; --i >= lo;
  1097                     b[i] = a[i]
  1098                 );
  1099                 run[++last] = right;
  1100             }
  1101             short[] t = a; a = b; b = t;
  1102         }
  1103     }
  1104 
  1105     /**
  1106      * Sorts the specified range of the array by Dual-Pivot Quicksort.
  1107      *
  1108      * @param a the array to be sorted
  1109      * @param left the index of the first element, inclusive, to be sorted
  1110      * @param right the index of the last element, inclusive, to be sorted
  1111      * @param leftmost indicates if this part is the leftmost in the range
  1112      */
  1113     private static void sort(short[] a, int left, int right, boolean leftmost) {
  1114         int length = right - left + 1;
  1115 
  1116         // Use insertion sort on tiny arrays
  1117         if (length < INSERTION_SORT_THRESHOLD) {
  1118             if (leftmost) {
  1119                 /*
  1120                  * Traditional (without sentinel) insertion sort,
  1121                  * optimized for server VM, is used in case of
  1122                  * the leftmost part.
  1123                  */
  1124                 for (int i = left, j = i; i < right; j = ++i) {
  1125                     short ai = a[i + 1];
  1126                     while (ai < a[j]) {
  1127                         a[j + 1] = a[j];
  1128                         if (j-- == left) {
  1129                             break;
  1130                         }
  1131                     }
  1132                     a[j + 1] = ai;
  1133                 }
  1134             } else {
  1135                 /*
  1136                  * Skip the longest ascending sequence.
  1137                  */
  1138                 do {
  1139                     if (left >= right) {
  1140                         return;
  1141                     }
  1142                 } while (a[++left] >= a[left - 1]);
  1143 
  1144                 /*
  1145                  * Every element from adjoining part plays the role
  1146                  * of sentinel, therefore this allows us to avoid the
  1147                  * left range check on each iteration. Moreover, we use
  1148                  * the more optimized algorithm, so called pair insertion
  1149                  * sort, which is faster (in the context of Quicksort)
  1150                  * than traditional implementation of insertion sort.
  1151                  */
  1152                 for (int k = left; ++left <= right; k = ++left) {
  1153                     short a1 = a[k], a2 = a[left];
  1154 
  1155                     if (a1 < a2) {
  1156                         a2 = a1; a1 = a[left];
  1157                     }
  1158                     while (a1 < a[--k]) {
  1159                         a[k + 2] = a[k];
  1160                     }
  1161                     a[++k + 1] = a1;
  1162 
  1163                     while (a2 < a[--k]) {
  1164                         a[k + 1] = a[k];
  1165                     }
  1166                     a[k + 1] = a2;
  1167                 }
  1168                 short last = a[right];
  1169 
  1170                 while (last < a[--right]) {
  1171                     a[right + 1] = a[right];
  1172                 }
  1173                 a[right + 1] = last;
  1174             }
  1175             return;
  1176         }
  1177 
  1178         // Inexpensive approximation of length / 7
  1179         int seventh = (length >> 3) + (length >> 6) + 1;
  1180 
  1181         /*
  1182          * Sort five evenly spaced elements around (and including) the
  1183          * center element in the range. These elements will be used for
  1184          * pivot selection as described below. The choice for spacing
  1185          * these elements was empirically determined to work well on
  1186          * a wide variety of inputs.
  1187          */
  1188         int e3 = (left + right) >>> 1; // The midpoint
  1189         int e2 = e3 - seventh;
  1190         int e1 = e2 - seventh;
  1191         int e4 = e3 + seventh;
  1192         int e5 = e4 + seventh;
  1193 
  1194         // Sort these elements using insertion sort
  1195         if (a[e2] < a[e1]) { short t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
  1196 
  1197         if (a[e3] < a[e2]) { short t = a[e3]; a[e3] = a[e2]; a[e2] = t;
  1198             if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  1199         }
  1200         if (a[e4] < a[e3]) { short t = a[e4]; a[e4] = a[e3]; a[e3] = t;
  1201             if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
  1202                 if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  1203             }
  1204         }
  1205         if (a[e5] < a[e4]) { short t = a[e5]; a[e5] = a[e4]; a[e4] = t;
  1206             if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
  1207                 if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
  1208                     if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  1209                 }
  1210             }
  1211         }
  1212 
  1213         // Pointers
  1214         int less  = left;  // The index of the first element of center part
  1215         int great = right; // The index before the first element of right part
  1216 
  1217         if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
  1218             /*
  1219              * Use the second and fourth of the five sorted elements as pivots.
  1220              * These values are inexpensive approximations of the first and
  1221              * second terciles of the array. Note that pivot1 <= pivot2.
  1222              */
  1223             short pivot1 = a[e2];
  1224             short pivot2 = a[e4];
  1225 
  1226             /*
  1227              * The first and the last elements to be sorted are moved to the
  1228              * locations formerly occupied by the pivots. When partitioning
  1229              * is complete, the pivots are swapped back into their final
  1230              * positions, and excluded from subsequent sorting.
  1231              */
  1232             a[e2] = a[left];
  1233             a[e4] = a[right];
  1234 
  1235             /*
  1236              * Skip elements, which are less or greater than pivot values.
  1237              */
  1238             while (a[++less] < pivot1);
  1239             while (a[--great] > pivot2);
  1240 
  1241             /*
  1242              * Partitioning:
  1243              *
  1244              *   left part           center part                   right part
  1245              * +--------------------------------------------------------------+
  1246              * |  < pivot1  |  pivot1 <= && <= pivot2  |    ?    |  > pivot2  |
  1247              * +--------------------------------------------------------------+
  1248              *               ^                          ^       ^
  1249              *               |                          |       |
  1250              *              less                        k     great
  1251              *
  1252              * Invariants:
  1253              *
  1254              *              all in (left, less)   < pivot1
  1255              *    pivot1 <= all in [less, k)     <= pivot2
  1256              *              all in (great, right) > pivot2
  1257              *
  1258              * Pointer k is the first index of ?-part.
  1259              */
  1260             outer:
  1261             for (int k = less - 1; ++k <= great; ) {
  1262                 short ak = a[k];
  1263                 if (ak < pivot1) { // Move a[k] to left part
  1264                     a[k] = a[less];
  1265                     /*
  1266                      * Here and below we use "a[i] = b; i++;" instead
  1267                      * of "a[i++] = b;" due to performance issue.
  1268                      */
  1269                     a[less] = ak;
  1270                     ++less;
  1271                 } else if (ak > pivot2) { // Move a[k] to right part
  1272                     while (a[great] > pivot2) {
  1273                         if (great-- == k) {
  1274                             break outer;
  1275                         }
  1276                     }
  1277                     if (a[great] < pivot1) { // a[great] <= pivot2
  1278                         a[k] = a[less];
  1279                         a[less] = a[great];
  1280                         ++less;
  1281                     } else { // pivot1 <= a[great] <= pivot2
  1282                         a[k] = a[great];
  1283                     }
  1284                     /*
  1285                      * Here and below we use "a[i] = b; i--;" instead
  1286                      * of "a[i--] = b;" due to performance issue.
  1287                      */
  1288                     a[great] = ak;
  1289                     --great;
  1290                 }
  1291             }
  1292 
  1293             // Swap pivots into their final positions
  1294             a[left]  = a[less  - 1]; a[less  - 1] = pivot1;
  1295             a[right] = a[great + 1]; a[great + 1] = pivot2;
  1296 
  1297             // Sort left and right parts recursively, excluding known pivots
  1298             sort(a, left, less - 2, leftmost);
  1299             sort(a, great + 2, right, false);
  1300 
  1301             /*
  1302              * If center part is too large (comprises > 4/7 of the array),
  1303              * swap internal pivot values to ends.
  1304              */
  1305             if (less < e1 && e5 < great) {
  1306                 /*
  1307                  * Skip elements, which are equal to pivot values.
  1308                  */
  1309                 while (a[less] == pivot1) {
  1310                     ++less;
  1311                 }
  1312 
  1313                 while (a[great] == pivot2) {
  1314                     --great;
  1315                 }
  1316 
  1317                 /*
  1318                  * Partitioning:
  1319                  *
  1320                  *   left part         center part                  right part
  1321                  * +----------------------------------------------------------+
  1322                  * | == pivot1 |  pivot1 < && < pivot2  |    ?    | == pivot2 |
  1323                  * +----------------------------------------------------------+
  1324                  *              ^                        ^       ^
  1325                  *              |                        |       |
  1326                  *             less                      k     great
  1327                  *
  1328                  * Invariants:
  1329                  *
  1330                  *              all in (*,  less) == pivot1
  1331                  *     pivot1 < all in [less,  k)  < pivot2
  1332                  *              all in (great, *) == pivot2
  1333                  *
  1334                  * Pointer k is the first index of ?-part.
  1335                  */
  1336                 outer:
  1337                 for (int k = less - 1; ++k <= great; ) {
  1338                     short ak = a[k];
  1339                     if (ak == pivot1) { // Move a[k] to left part
  1340                         a[k] = a[less];
  1341                         a[less] = ak;
  1342                         ++less;
  1343                     } else if (ak == pivot2) { // Move a[k] to right part
  1344                         while (a[great] == pivot2) {
  1345                             if (great-- == k) {
  1346                                 break outer;
  1347                             }
  1348                         }
  1349                         if (a[great] == pivot1) { // a[great] < pivot2
  1350                             a[k] = a[less];
  1351                             /*
  1352                              * Even though a[great] equals to pivot1, the
  1353                              * assignment a[less] = pivot1 may be incorrect,
  1354                              * if a[great] and pivot1 are floating-point zeros
  1355                              * of different signs. Therefore in float and
  1356                              * double sorting methods we have to use more
  1357                              * accurate assignment a[less] = a[great].
  1358                              */
  1359                             a[less] = pivot1;
  1360                             ++less;
  1361                         } else { // pivot1 < a[great] < pivot2
  1362                             a[k] = a[great];
  1363                         }
  1364                         a[great] = ak;
  1365                         --great;
  1366                     }
  1367                 }
  1368             }
  1369 
  1370             // Sort center part recursively
  1371             sort(a, less, great, false);
  1372 
  1373         } else { // Partitioning with one pivot
  1374             /*
  1375              * Use the third of the five sorted elements as pivot.
  1376              * This value is inexpensive approximation of the median.
  1377              */
  1378             short pivot = a[e3];
  1379 
  1380             /*
  1381              * Partitioning degenerates to the traditional 3-way
  1382              * (or "Dutch National Flag") schema:
  1383              *
  1384              *   left part    center part              right part
  1385              * +-------------------------------------------------+
  1386              * |  < pivot  |   == pivot   |     ?    |  > pivot  |
  1387              * +-------------------------------------------------+
  1388              *              ^              ^        ^
  1389              *              |              |        |
  1390              *             less            k      great
  1391              *
  1392              * Invariants:
  1393              *
  1394              *   all in (left, less)   < pivot
  1395              *   all in [less, k)     == pivot
  1396              *   all in (great, right) > pivot
  1397              *
  1398              * Pointer k is the first index of ?-part.
  1399              */
  1400             for (int k = less; k <= great; ++k) {
  1401                 if (a[k] == pivot) {
  1402                     continue;
  1403                 }
  1404                 short ak = a[k];
  1405                 if (ak < pivot) { // Move a[k] to left part
  1406                     a[k] = a[less];
  1407                     a[less] = ak;
  1408                     ++less;
  1409                 } else { // a[k] > pivot - Move a[k] to right part
  1410                     while (a[great] > pivot) {
  1411                         --great;
  1412                     }
  1413                     if (a[great] < pivot) { // a[great] <= pivot
  1414                         a[k] = a[less];
  1415                         a[less] = a[great];
  1416                         ++less;
  1417                     } else { // a[great] == pivot
  1418                         /*
  1419                          * Even though a[great] equals to pivot, the
  1420                          * assignment a[k] = pivot may be incorrect,
  1421                          * if a[great] and pivot are floating-point
  1422                          * zeros of different signs. Therefore in float
  1423                          * and double sorting methods we have to use
  1424                          * more accurate assignment a[k] = a[great].
  1425                          */
  1426                         a[k] = pivot;
  1427                     }
  1428                     a[great] = ak;
  1429                     --great;
  1430                 }
  1431             }
  1432 
  1433             /*
  1434              * Sort left and right parts recursively.
  1435              * All elements from center part are equal
  1436              * and, therefore, already sorted.
  1437              */
  1438             sort(a, left, less - 1, leftmost);
  1439             sort(a, great + 1, right, false);
  1440         }
  1441     }
  1442 
  1443     /**
  1444      * Sorts the specified array.
  1445      *
  1446      * @param a the array to be sorted
  1447      */
  1448     public static void sort(char[] a) {
  1449         sort(a, 0, a.length - 1);
  1450     }
  1451 
  1452     /**
  1453      * Sorts the specified range of the array.
  1454      *
  1455      * @param a the array to be sorted
  1456      * @param left the index of the first element, inclusive, to be sorted
  1457      * @param right the index of the last element, inclusive, to be sorted
  1458      */
  1459     public static void sort(char[] a, int left, int right) {
  1460         // Use counting sort on large arrays
  1461         if (right - left > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) {
  1462             int[] count = new int[NUM_CHAR_VALUES];
  1463 
  1464             for (int i = left - 1; ++i <= right;
  1465                 count[a[i]]++
  1466             );
  1467             for (int i = NUM_CHAR_VALUES, k = right + 1; k > left; ) {
  1468                 while (count[--i] == 0);
  1469                 char value = (char) i;
  1470                 int s = count[i];
  1471 
  1472                 do {
  1473                     a[--k] = value;
  1474                 } while (--s > 0);
  1475             }
  1476         } else { // Use Dual-Pivot Quicksort on small arrays
  1477             doSort(a, left, right);
  1478         }
  1479     }
  1480 
  1481     /** The number of distinct char values. */
  1482     private static final int NUM_CHAR_VALUES = 1 << 16;
  1483 
  1484     /**
  1485      * Sorts the specified range of the array.
  1486      *
  1487      * @param a the array to be sorted
  1488      * @param left the index of the first element, inclusive, to be sorted
  1489      * @param right the index of the last element, inclusive, to be sorted
  1490      */
  1491     private static void doSort(char[] a, int left, int right) {
  1492         // Use Quicksort on small arrays
  1493         if (right - left < QUICKSORT_THRESHOLD) {
  1494             sort(a, left, right, true);
  1495             return;
  1496         }
  1497 
  1498         /*
  1499          * Index run[i] is the start of i-th run
  1500          * (ascending or descending sequence).
  1501          */
  1502         int[] run = new int[MAX_RUN_COUNT + 1];
  1503         int count = 0; run[0] = left;
  1504 
  1505         // Check if the array is nearly sorted
  1506         for (int k = left; k < right; run[count] = k) {
  1507             if (a[k] < a[k + 1]) { // ascending
  1508                 while (++k <= right && a[k - 1] <= a[k]);
  1509             } else if (a[k] > a[k + 1]) { // descending
  1510                 while (++k <= right && a[k - 1] >= a[k]);
  1511                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
  1512                     char t = a[lo]; a[lo] = a[hi]; a[hi] = t;
  1513                 }
  1514             } else { // equal
  1515                 for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
  1516                     if (--m == 0) {
  1517                         sort(a, left, right, true);
  1518                         return;
  1519                     }
  1520                 }
  1521             }
  1522 
  1523             /*
  1524              * The array is not highly structured,
  1525              * use Quicksort instead of merge sort.
  1526              */
  1527             if (++count == MAX_RUN_COUNT) {
  1528                 sort(a, left, right, true);
  1529                 return;
  1530             }
  1531         }
  1532 
  1533         // Check special cases
  1534         if (run[count] == right++) { // The last run contains one element
  1535             run[++count] = right;
  1536         } else if (count == 1) { // The array is already sorted
  1537             return;
  1538         }
  1539 
  1540         /*
  1541          * Create temporary array, which is used for merging.
  1542          * Implementation note: variable "right" is increased by 1.
  1543          */
  1544         char[] b; byte odd = 0;
  1545         for (int n = 1; (n <<= 1) < count; odd ^= 1);
  1546 
  1547         if (odd == 0) {
  1548             b = a; a = new char[b.length];
  1549             for (int i = left - 1; ++i < right; a[i] = b[i]);
  1550         } else {
  1551             b = new char[a.length];
  1552         }
  1553 
  1554         // Merging
  1555         for (int last; count > 1; count = last) {
  1556             for (int k = (last = 0) + 2; k <= count; k += 2) {
  1557                 int hi = run[k], mi = run[k - 1];
  1558                 for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
  1559                     if (q >= hi || p < mi && a[p] <= a[q]) {
  1560                         b[i] = a[p++];
  1561                     } else {
  1562                         b[i] = a[q++];
  1563                     }
  1564                 }
  1565                 run[++last] = hi;
  1566             }
  1567             if ((count & 1) != 0) {
  1568                 for (int i = right, lo = run[count - 1]; --i >= lo;
  1569                     b[i] = a[i]
  1570                 );
  1571                 run[++last] = right;
  1572             }
  1573             char[] t = a; a = b; b = t;
  1574         }
  1575     }
  1576 
  1577     /**
  1578      * Sorts the specified range of the array by Dual-Pivot Quicksort.
  1579      *
  1580      * @param a the array to be sorted
  1581      * @param left the index of the first element, inclusive, to be sorted
  1582      * @param right the index of the last element, inclusive, to be sorted
  1583      * @param leftmost indicates if this part is the leftmost in the range
  1584      */
  1585     private static void sort(char[] a, int left, int right, boolean leftmost) {
  1586         int length = right - left + 1;
  1587 
  1588         // Use insertion sort on tiny arrays
  1589         if (length < INSERTION_SORT_THRESHOLD) {
  1590             if (leftmost) {
  1591                 /*
  1592                  * Traditional (without sentinel) insertion sort,
  1593                  * optimized for server VM, is used in case of
  1594                  * the leftmost part.
  1595                  */
  1596                 for (int i = left, j = i; i < right; j = ++i) {
  1597                     char ai = a[i + 1];
  1598                     while (ai < a[j]) {
  1599                         a[j + 1] = a[j];
  1600                         if (j-- == left) {
  1601                             break;
  1602                         }
  1603                     }
  1604                     a[j + 1] = ai;
  1605                 }
  1606             } else {
  1607                 /*
  1608                  * Skip the longest ascending sequence.
  1609                  */
  1610                 do {
  1611                     if (left >= right) {
  1612                         return;
  1613                     }
  1614                 } while (a[++left] >= a[left - 1]);
  1615 
  1616                 /*
  1617                  * Every element from adjoining part plays the role
  1618                  * of sentinel, therefore this allows us to avoid the
  1619                  * left range check on each iteration. Moreover, we use
  1620                  * the more optimized algorithm, so called pair insertion
  1621                  * sort, which is faster (in the context of Quicksort)
  1622                  * than traditional implementation of insertion sort.
  1623                  */
  1624                 for (int k = left; ++left <= right; k = ++left) {
  1625                     char a1 = a[k], a2 = a[left];
  1626 
  1627                     if (a1 < a2) {
  1628                         a2 = a1; a1 = a[left];
  1629                     }
  1630                     while (a1 < a[--k]) {
  1631                         a[k + 2] = a[k];
  1632                     }
  1633                     a[++k + 1] = a1;
  1634 
  1635                     while (a2 < a[--k]) {
  1636                         a[k + 1] = a[k];
  1637                     }
  1638                     a[k + 1] = a2;
  1639                 }
  1640                 char last = a[right];
  1641 
  1642                 while (last < a[--right]) {
  1643                     a[right + 1] = a[right];
  1644                 }
  1645                 a[right + 1] = last;
  1646             }
  1647             return;
  1648         }
  1649 
  1650         // Inexpensive approximation of length / 7
  1651         int seventh = (length >> 3) + (length >> 6) + 1;
  1652 
  1653         /*
  1654          * Sort five evenly spaced elements around (and including) the
  1655          * center element in the range. These elements will be used for
  1656          * pivot selection as described below. The choice for spacing
  1657          * these elements was empirically determined to work well on
  1658          * a wide variety of inputs.
  1659          */
  1660         int e3 = (left + right) >>> 1; // The midpoint
  1661         int e2 = e3 - seventh;
  1662         int e1 = e2 - seventh;
  1663         int e4 = e3 + seventh;
  1664         int e5 = e4 + seventh;
  1665 
  1666         // Sort these elements using insertion sort
  1667         if (a[e2] < a[e1]) { char t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
  1668 
  1669         if (a[e3] < a[e2]) { char t = a[e3]; a[e3] = a[e2]; a[e2] = t;
  1670             if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  1671         }
  1672         if (a[e4] < a[e3]) { char t = a[e4]; a[e4] = a[e3]; a[e3] = t;
  1673             if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
  1674                 if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  1675             }
  1676         }
  1677         if (a[e5] < a[e4]) { char t = a[e5]; a[e5] = a[e4]; a[e4] = t;
  1678             if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
  1679                 if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
  1680                     if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  1681                 }
  1682             }
  1683         }
  1684 
  1685         // Pointers
  1686         int less  = left;  // The index of the first element of center part
  1687         int great = right; // The index before the first element of right part
  1688 
  1689         if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
  1690             /*
  1691              * Use the second and fourth of the five sorted elements as pivots.
  1692              * These values are inexpensive approximations of the first and
  1693              * second terciles of the array. Note that pivot1 <= pivot2.
  1694              */
  1695             char pivot1 = a[e2];
  1696             char pivot2 = a[e4];
  1697 
  1698             /*
  1699              * The first and the last elements to be sorted are moved to the
  1700              * locations formerly occupied by the pivots. When partitioning
  1701              * is complete, the pivots are swapped back into their final
  1702              * positions, and excluded from subsequent sorting.
  1703              */
  1704             a[e2] = a[left];
  1705             a[e4] = a[right];
  1706 
  1707             /*
  1708              * Skip elements, which are less or greater than pivot values.
  1709              */
  1710             while (a[++less] < pivot1);
  1711             while (a[--great] > pivot2);
  1712 
  1713             /*
  1714              * Partitioning:
  1715              *
  1716              *   left part           center part                   right part
  1717              * +--------------------------------------------------------------+
  1718              * |  < pivot1  |  pivot1 <= && <= pivot2  |    ?    |  > pivot2  |
  1719              * +--------------------------------------------------------------+
  1720              *               ^                          ^       ^
  1721              *               |                          |       |
  1722              *              less                        k     great
  1723              *
  1724              * Invariants:
  1725              *
  1726              *              all in (left, less)   < pivot1
  1727              *    pivot1 <= all in [less, k)     <= pivot2
  1728              *              all in (great, right) > pivot2
  1729              *
  1730              * Pointer k is the first index of ?-part.
  1731              */
  1732             outer:
  1733             for (int k = less - 1; ++k <= great; ) {
  1734                 char ak = a[k];
  1735                 if (ak < pivot1) { // Move a[k] to left part
  1736                     a[k] = a[less];
  1737                     /*
  1738                      * Here and below we use "a[i] = b; i++;" instead
  1739                      * of "a[i++] = b;" due to performance issue.
  1740                      */
  1741                     a[less] = ak;
  1742                     ++less;
  1743                 } else if (ak > pivot2) { // Move a[k] to right part
  1744                     while (a[great] > pivot2) {
  1745                         if (great-- == k) {
  1746                             break outer;
  1747                         }
  1748                     }
  1749                     if (a[great] < pivot1) { // a[great] <= pivot2
  1750                         a[k] = a[less];
  1751                         a[less] = a[great];
  1752                         ++less;
  1753                     } else { // pivot1 <= a[great] <= pivot2
  1754                         a[k] = a[great];
  1755                     }
  1756                     /*
  1757                      * Here and below we use "a[i] = b; i--;" instead
  1758                      * of "a[i--] = b;" due to performance issue.
  1759                      */
  1760                     a[great] = ak;
  1761                     --great;
  1762                 }
  1763             }
  1764 
  1765             // Swap pivots into their final positions
  1766             a[left]  = a[less  - 1]; a[less  - 1] = pivot1;
  1767             a[right] = a[great + 1]; a[great + 1] = pivot2;
  1768 
  1769             // Sort left and right parts recursively, excluding known pivots
  1770             sort(a, left, less - 2, leftmost);
  1771             sort(a, great + 2, right, false);
  1772 
  1773             /*
  1774              * If center part is too large (comprises > 4/7 of the array),
  1775              * swap internal pivot values to ends.
  1776              */
  1777             if (less < e1 && e5 < great) {
  1778                 /*
  1779                  * Skip elements, which are equal to pivot values.
  1780                  */
  1781                 while (a[less] == pivot1) {
  1782                     ++less;
  1783                 }
  1784 
  1785                 while (a[great] == pivot2) {
  1786                     --great;
  1787                 }
  1788 
  1789                 /*
  1790                  * Partitioning:
  1791                  *
  1792                  *   left part         center part                  right part
  1793                  * +----------------------------------------------------------+
  1794                  * | == pivot1 |  pivot1 < && < pivot2  |    ?    | == pivot2 |
  1795                  * +----------------------------------------------------------+
  1796                  *              ^                        ^       ^
  1797                  *              |                        |       |
  1798                  *             less                      k     great
  1799                  *
  1800                  * Invariants:
  1801                  *
  1802                  *              all in (*,  less) == pivot1
  1803                  *     pivot1 < all in [less,  k)  < pivot2
  1804                  *              all in (great, *) == pivot2
  1805                  *
  1806                  * Pointer k is the first index of ?-part.
  1807                  */
  1808                 outer:
  1809                 for (int k = less - 1; ++k <= great; ) {
  1810                     char ak = a[k];
  1811                     if (ak == pivot1) { // Move a[k] to left part
  1812                         a[k] = a[less];
  1813                         a[less] = ak;
  1814                         ++less;
  1815                     } else if (ak == pivot2) { // Move a[k] to right part
  1816                         while (a[great] == pivot2) {
  1817                             if (great-- == k) {
  1818                                 break outer;
  1819                             }
  1820                         }
  1821                         if (a[great] == pivot1) { // a[great] < pivot2
  1822                             a[k] = a[less];
  1823                             /*
  1824                              * Even though a[great] equals to pivot1, the
  1825                              * assignment a[less] = pivot1 may be incorrect,
  1826                              * if a[great] and pivot1 are floating-point zeros
  1827                              * of different signs. Therefore in float and
  1828                              * double sorting methods we have to use more
  1829                              * accurate assignment a[less] = a[great].
  1830                              */
  1831                             a[less] = pivot1;
  1832                             ++less;
  1833                         } else { // pivot1 < a[great] < pivot2
  1834                             a[k] = a[great];
  1835                         }
  1836                         a[great] = ak;
  1837                         --great;
  1838                     }
  1839                 }
  1840             }
  1841 
  1842             // Sort center part recursively
  1843             sort(a, less, great, false);
  1844 
  1845         } else { // Partitioning with one pivot
  1846             /*
  1847              * Use the third of the five sorted elements as pivot.
  1848              * This value is inexpensive approximation of the median.
  1849              */
  1850             char pivot = a[e3];
  1851 
  1852             /*
  1853              * Partitioning degenerates to the traditional 3-way
  1854              * (or "Dutch National Flag") schema:
  1855              *
  1856              *   left part    center part              right part
  1857              * +-------------------------------------------------+
  1858              * |  < pivot  |   == pivot   |     ?    |  > pivot  |
  1859              * +-------------------------------------------------+
  1860              *              ^              ^        ^
  1861              *              |              |        |
  1862              *             less            k      great
  1863              *
  1864              * Invariants:
  1865              *
  1866              *   all in (left, less)   < pivot
  1867              *   all in [less, k)     == pivot
  1868              *   all in (great, right) > pivot
  1869              *
  1870              * Pointer k is the first index of ?-part.
  1871              */
  1872             for (int k = less; k <= great; ++k) {
  1873                 if (a[k] == pivot) {
  1874                     continue;
  1875                 }
  1876                 char ak = a[k];
  1877                 if (ak < pivot) { // Move a[k] to left part
  1878                     a[k] = a[less];
  1879                     a[less] = ak;
  1880                     ++less;
  1881                 } else { // a[k] > pivot - Move a[k] to right part
  1882                     while (a[great] > pivot) {
  1883                         --great;
  1884                     }
  1885                     if (a[great] < pivot) { // a[great] <= pivot
  1886                         a[k] = a[less];
  1887                         a[less] = a[great];
  1888                         ++less;
  1889                     } else { // a[great] == pivot
  1890                         /*
  1891                          * Even though a[great] equals to pivot, the
  1892                          * assignment a[k] = pivot may be incorrect,
  1893                          * if a[great] and pivot are floating-point
  1894                          * zeros of different signs. Therefore in float
  1895                          * and double sorting methods we have to use
  1896                          * more accurate assignment a[k] = a[great].
  1897                          */
  1898                         a[k] = pivot;
  1899                     }
  1900                     a[great] = ak;
  1901                     --great;
  1902                 }
  1903             }
  1904 
  1905             /*
  1906              * Sort left and right parts recursively.
  1907              * All elements from center part are equal
  1908              * and, therefore, already sorted.
  1909              */
  1910             sort(a, left, less - 1, leftmost);
  1911             sort(a, great + 1, right, false);
  1912         }
  1913     }
  1914 
  1915     /** The number of distinct byte values. */
  1916     private static final int NUM_BYTE_VALUES = 1 << 8;
  1917 
  1918     /**
  1919      * Sorts the specified array.
  1920      *
  1921      * @param a the array to be sorted
  1922      */
  1923     public static void sort(byte[] a) {
  1924         sort(a, 0, a.length - 1);
  1925     }
  1926 
  1927     /**
  1928      * Sorts the specified range of the array.
  1929      *
  1930      * @param a the array to be sorted
  1931      * @param left the index of the first element, inclusive, to be sorted
  1932      * @param right the index of the last element, inclusive, to be sorted
  1933      */
  1934     public static void sort(byte[] a, int left, int right) {
  1935         // Use counting sort on large arrays
  1936         if (right - left > COUNTING_SORT_THRESHOLD_FOR_BYTE) {
  1937             int[] count = new int[NUM_BYTE_VALUES];
  1938 
  1939             for (int i = left - 1; ++i <= right;
  1940                 count[a[i] - Byte.MIN_VALUE]++
  1941             );
  1942             for (int i = NUM_BYTE_VALUES, k = right + 1; k > left; ) {
  1943                 while (count[--i] == 0);
  1944                 byte value = (byte) (i + Byte.MIN_VALUE);
  1945                 int s = count[i];
  1946 
  1947                 do {
  1948                     a[--k] = value;
  1949                 } while (--s > 0);
  1950             }
  1951         } else { // Use insertion sort on small arrays
  1952             for (int i = left, j = i; i < right; j = ++i) {
  1953                 byte ai = a[i + 1];
  1954                 while (ai < a[j]) {
  1955                     a[j + 1] = a[j];
  1956                     if (j-- == left) {
  1957                         break;
  1958                     }
  1959                 }
  1960                 a[j + 1] = ai;
  1961             }
  1962         }
  1963     }
  1964 
  1965     /**
  1966      * Sorts the specified array.
  1967      *
  1968      * @param a the array to be sorted
  1969      */
  1970     public static void sort(float[] a) {
  1971         sort(a, 0, a.length - 1);
  1972     }
  1973 
  1974     /**
  1975      * Sorts the specified range of the array.
  1976      *
  1977      * @param a the array to be sorted
  1978      * @param left the index of the first element, inclusive, to be sorted
  1979      * @param right the index of the last element, inclusive, to be sorted
  1980      */
  1981     public static void sort(float[] a, int left, int right) {
  1982         /*
  1983          * Phase 1: Move NaNs to the end of the array.
  1984          */
  1985         while (left <= right && Float.isNaN(a[right])) {
  1986             --right;
  1987         }
  1988         for (int k = right; --k >= left; ) {
  1989             float ak = a[k];
  1990             if (ak != ak) { // a[k] is NaN
  1991                 a[k] = a[right];
  1992                 a[right] = ak;
  1993                 --right;
  1994             }
  1995         }
  1996 
  1997         /*
  1998          * Phase 2: Sort everything except NaNs (which are already in place).
  1999          */
  2000         doSort(a, left, right);
  2001 
  2002         /*
  2003          * Phase 3: Place negative zeros before positive zeros.
  2004          */
  2005         int hi = right;
  2006 
  2007         /*
  2008          * Find the first zero, or first positive, or last negative element.
  2009          */
  2010         while (left < hi) {
  2011             int middle = (left + hi) >>> 1;
  2012             float middleValue = a[middle];
  2013 
  2014             if (middleValue < 0.0f) {
  2015                 left = middle + 1;
  2016             } else {
  2017                 hi = middle;
  2018             }
  2019         }
  2020 
  2021         /*
  2022          * Skip the last negative value (if any) or all leading negative zeros.
  2023          */
  2024         while (left <= right && Float.floatToRawIntBits(a[left]) < 0) {
  2025             ++left;
  2026         }
  2027 
  2028         /*
  2029          * Move negative zeros to the beginning of the sub-range.
  2030          *
  2031          * Partitioning:
  2032          *
  2033          * +----------------------------------------------------+
  2034          * |   < 0.0   |   -0.0   |   0.0   |   ?  ( >= 0.0 )   |
  2035          * +----------------------------------------------------+
  2036          *              ^          ^         ^
  2037          *              |          |         |
  2038          *             left        p         k
  2039          *
  2040          * Invariants:
  2041          *
  2042          *   all in (*,  left)  <  0.0
  2043          *   all in [left,  p) == -0.0
  2044          *   all in [p,     k) ==  0.0
  2045          *   all in [k, right] >=  0.0
  2046          *
  2047          * Pointer k is the first index of ?-part.
  2048          */
  2049         for (int k = left, p = left - 1; ++k <= right; ) {
  2050             float ak = a[k];
  2051             if (ak != 0.0f) {
  2052                 break;
  2053             }
  2054             if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f
  2055                 a[k] = 0.0f;
  2056                 a[++p] = -0.0f;
  2057             }
  2058         }
  2059     }
  2060 
  2061     /**
  2062      * Sorts the specified range of the array.
  2063      *
  2064      * @param a the array to be sorted
  2065      * @param left the index of the first element, inclusive, to be sorted
  2066      * @param right the index of the last element, inclusive, to be sorted
  2067      */
  2068     private static void doSort(float[] a, int left, int right) {
  2069         // Use Quicksort on small arrays
  2070         if (right - left < QUICKSORT_THRESHOLD) {
  2071             sort(a, left, right, true);
  2072             return;
  2073         }
  2074 
  2075         /*
  2076          * Index run[i] is the start of i-th run
  2077          * (ascending or descending sequence).
  2078          */
  2079         int[] run = new int[MAX_RUN_COUNT + 1];
  2080         int count = 0; run[0] = left;
  2081 
  2082         // Check if the array is nearly sorted
  2083         for (int k = left; k < right; run[count] = k) {
  2084             if (a[k] < a[k + 1]) { // ascending
  2085                 while (++k <= right && a[k - 1] <= a[k]);
  2086             } else if (a[k] > a[k + 1]) { // descending
  2087                 while (++k <= right && a[k - 1] >= a[k]);
  2088                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
  2089                     float t = a[lo]; a[lo] = a[hi]; a[hi] = t;
  2090                 }
  2091             } else { // equal
  2092                 for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
  2093                     if (--m == 0) {
  2094                         sort(a, left, right, true);
  2095                         return;
  2096                     }
  2097                 }
  2098             }
  2099 
  2100             /*
  2101              * The array is not highly structured,
  2102              * use Quicksort instead of merge sort.
  2103              */
  2104             if (++count == MAX_RUN_COUNT) {
  2105                 sort(a, left, right, true);
  2106                 return;
  2107             }
  2108         }
  2109 
  2110         // Check special cases
  2111         if (run[count] == right++) { // The last run contains one element
  2112             run[++count] = right;
  2113         } else if (count == 1) { // The array is already sorted
  2114             return;
  2115         }
  2116 
  2117         /*
  2118          * Create temporary array, which is used for merging.
  2119          * Implementation note: variable "right" is increased by 1.
  2120          */
  2121         float[] b; byte odd = 0;
  2122         for (int n = 1; (n <<= 1) < count; odd ^= 1);
  2123 
  2124         if (odd == 0) {
  2125             b = a; a = new float[b.length];
  2126             for (int i = left - 1; ++i < right; a[i] = b[i]);
  2127         } else {
  2128             b = new float[a.length];
  2129         }
  2130 
  2131         // Merging
  2132         for (int last; count > 1; count = last) {
  2133             for (int k = (last = 0) + 2; k <= count; k += 2) {
  2134                 int hi = run[k], mi = run[k - 1];
  2135                 for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
  2136                     if (q >= hi || p < mi && a[p] <= a[q]) {
  2137                         b[i] = a[p++];
  2138                     } else {
  2139                         b[i] = a[q++];
  2140                     }
  2141                 }
  2142                 run[++last] = hi;
  2143             }
  2144             if ((count & 1) != 0) {
  2145                 for (int i = right, lo = run[count - 1]; --i >= lo;
  2146                     b[i] = a[i]
  2147                 );
  2148                 run[++last] = right;
  2149             }
  2150             float[] t = a; a = b; b = t;
  2151         }
  2152     }
  2153 
  2154     /**
  2155      * Sorts the specified range of the array by Dual-Pivot Quicksort.
  2156      *
  2157      * @param a the array to be sorted
  2158      * @param left the index of the first element, inclusive, to be sorted
  2159      * @param right the index of the last element, inclusive, to be sorted
  2160      * @param leftmost indicates if this part is the leftmost in the range
  2161      */
  2162     private static void sort(float[] a, int left, int right, boolean leftmost) {
  2163         int length = right - left + 1;
  2164 
  2165         // Use insertion sort on tiny arrays
  2166         if (length < INSERTION_SORT_THRESHOLD) {
  2167             if (leftmost) {
  2168                 /*
  2169                  * Traditional (without sentinel) insertion sort,
  2170                  * optimized for server VM, is used in case of
  2171                  * the leftmost part.
  2172                  */
  2173                 for (int i = left, j = i; i < right; j = ++i) {
  2174                     float ai = a[i + 1];
  2175                     while (ai < a[j]) {
  2176                         a[j + 1] = a[j];
  2177                         if (j-- == left) {
  2178                             break;
  2179                         }
  2180                     }
  2181                     a[j + 1] = ai;
  2182                 }
  2183             } else {
  2184                 /*
  2185                  * Skip the longest ascending sequence.
  2186                  */
  2187                 do {
  2188                     if (left >= right) {
  2189                         return;
  2190                     }
  2191                 } while (a[++left] >= a[left - 1]);
  2192 
  2193                 /*
  2194                  * Every element from adjoining part plays the role
  2195                  * of sentinel, therefore this allows us to avoid the
  2196                  * left range check on each iteration. Moreover, we use
  2197                  * the more optimized algorithm, so called pair insertion
  2198                  * sort, which is faster (in the context of Quicksort)
  2199                  * than traditional implementation of insertion sort.
  2200                  */
  2201                 for (int k = left; ++left <= right; k = ++left) {
  2202                     float a1 = a[k], a2 = a[left];
  2203 
  2204                     if (a1 < a2) {
  2205                         a2 = a1; a1 = a[left];
  2206                     }
  2207                     while (a1 < a[--k]) {
  2208                         a[k + 2] = a[k];
  2209                     }
  2210                     a[++k + 1] = a1;
  2211 
  2212                     while (a2 < a[--k]) {
  2213                         a[k + 1] = a[k];
  2214                     }
  2215                     a[k + 1] = a2;
  2216                 }
  2217                 float last = a[right];
  2218 
  2219                 while (last < a[--right]) {
  2220                     a[right + 1] = a[right];
  2221                 }
  2222                 a[right + 1] = last;
  2223             }
  2224             return;
  2225         }
  2226 
  2227         // Inexpensive approximation of length / 7
  2228         int seventh = (length >> 3) + (length >> 6) + 1;
  2229 
  2230         /*
  2231          * Sort five evenly spaced elements around (and including) the
  2232          * center element in the range. These elements will be used for
  2233          * pivot selection as described below. The choice for spacing
  2234          * these elements was empirically determined to work well on
  2235          * a wide variety of inputs.
  2236          */
  2237         int e3 = (left + right) >>> 1; // The midpoint
  2238         int e2 = e3 - seventh;
  2239         int e1 = e2 - seventh;
  2240         int e4 = e3 + seventh;
  2241         int e5 = e4 + seventh;
  2242 
  2243         // Sort these elements using insertion sort
  2244         if (a[e2] < a[e1]) { float t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
  2245 
  2246         if (a[e3] < a[e2]) { float t = a[e3]; a[e3] = a[e2]; a[e2] = t;
  2247             if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  2248         }
  2249         if (a[e4] < a[e3]) { float t = a[e4]; a[e4] = a[e3]; a[e3] = t;
  2250             if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
  2251                 if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  2252             }
  2253         }
  2254         if (a[e5] < a[e4]) { float t = a[e5]; a[e5] = a[e4]; a[e4] = t;
  2255             if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
  2256                 if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
  2257                     if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  2258                 }
  2259             }
  2260         }
  2261 
  2262         // Pointers
  2263         int less  = left;  // The index of the first element of center part
  2264         int great = right; // The index before the first element of right part
  2265 
  2266         if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
  2267             /*
  2268              * Use the second and fourth of the five sorted elements as pivots.
  2269              * These values are inexpensive approximations of the first and
  2270              * second terciles of the array. Note that pivot1 <= pivot2.
  2271              */
  2272             float pivot1 = a[e2];
  2273             float pivot2 = a[e4];
  2274 
  2275             /*
  2276              * The first and the last elements to be sorted are moved to the
  2277              * locations formerly occupied by the pivots. When partitioning
  2278              * is complete, the pivots are swapped back into their final
  2279              * positions, and excluded from subsequent sorting.
  2280              */
  2281             a[e2] = a[left];
  2282             a[e4] = a[right];
  2283 
  2284             /*
  2285              * Skip elements, which are less or greater than pivot values.
  2286              */
  2287             while (a[++less] < pivot1);
  2288             while (a[--great] > pivot2);
  2289 
  2290             /*
  2291              * Partitioning:
  2292              *
  2293              *   left part           center part                   right part
  2294              * +--------------------------------------------------------------+
  2295              * |  < pivot1  |  pivot1 <= && <= pivot2  |    ?    |  > pivot2  |
  2296              * +--------------------------------------------------------------+
  2297              *               ^                          ^       ^
  2298              *               |                          |       |
  2299              *              less                        k     great
  2300              *
  2301              * Invariants:
  2302              *
  2303              *              all in (left, less)   < pivot1
  2304              *    pivot1 <= all in [less, k)     <= pivot2
  2305              *              all in (great, right) > pivot2
  2306              *
  2307              * Pointer k is the first index of ?-part.
  2308              */
  2309             outer:
  2310             for (int k = less - 1; ++k <= great; ) {
  2311                 float ak = a[k];
  2312                 if (ak < pivot1) { // Move a[k] to left part
  2313                     a[k] = a[less];
  2314                     /*
  2315                      * Here and below we use "a[i] = b; i++;" instead
  2316                      * of "a[i++] = b;" due to performance issue.
  2317                      */
  2318                     a[less] = ak;
  2319                     ++less;
  2320                 } else if (ak > pivot2) { // Move a[k] to right part
  2321                     while (a[great] > pivot2) {
  2322                         if (great-- == k) {
  2323                             break outer;
  2324                         }
  2325                     }
  2326                     if (a[great] < pivot1) { // a[great] <= pivot2
  2327                         a[k] = a[less];
  2328                         a[less] = a[great];
  2329                         ++less;
  2330                     } else { // pivot1 <= a[great] <= pivot2
  2331                         a[k] = a[great];
  2332                     }
  2333                     /*
  2334                      * Here and below we use "a[i] = b; i--;" instead
  2335                      * of "a[i--] = b;" due to performance issue.
  2336                      */
  2337                     a[great] = ak;
  2338                     --great;
  2339                 }
  2340             }
  2341 
  2342             // Swap pivots into their final positions
  2343             a[left]  = a[less  - 1]; a[less  - 1] = pivot1;
  2344             a[right] = a[great + 1]; a[great + 1] = pivot2;
  2345 
  2346             // Sort left and right parts recursively, excluding known pivots
  2347             sort(a, left, less - 2, leftmost);
  2348             sort(a, great + 2, right, false);
  2349 
  2350             /*
  2351              * If center part is too large (comprises > 4/7 of the array),
  2352              * swap internal pivot values to ends.
  2353              */
  2354             if (less < e1 && e5 < great) {
  2355                 /*
  2356                  * Skip elements, which are equal to pivot values.
  2357                  */
  2358                 while (a[less] == pivot1) {
  2359                     ++less;
  2360                 }
  2361 
  2362                 while (a[great] == pivot2) {
  2363                     --great;
  2364                 }
  2365 
  2366                 /*
  2367                  * Partitioning:
  2368                  *
  2369                  *   left part         center part                  right part
  2370                  * +----------------------------------------------------------+
  2371                  * | == pivot1 |  pivot1 < && < pivot2  |    ?    | == pivot2 |
  2372                  * +----------------------------------------------------------+
  2373                  *              ^                        ^       ^
  2374                  *              |                        |       |
  2375                  *             less                      k     great
  2376                  *
  2377                  * Invariants:
  2378                  *
  2379                  *              all in (*,  less) == pivot1
  2380                  *     pivot1 < all in [less,  k)  < pivot2
  2381                  *              all in (great, *) == pivot2
  2382                  *
  2383                  * Pointer k is the first index of ?-part.
  2384                  */
  2385                 outer:
  2386                 for (int k = less - 1; ++k <= great; ) {
  2387                     float ak = a[k];
  2388                     if (ak == pivot1) { // Move a[k] to left part
  2389                         a[k] = a[less];
  2390                         a[less] = ak;
  2391                         ++less;
  2392                     } else if (ak == pivot2) { // Move a[k] to right part
  2393                         while (a[great] == pivot2) {
  2394                             if (great-- == k) {
  2395                                 break outer;
  2396                             }
  2397                         }
  2398                         if (a[great] == pivot1) { // a[great] < pivot2
  2399                             a[k] = a[less];
  2400                             /*
  2401                              * Even though a[great] equals to pivot1, the
  2402                              * assignment a[less] = pivot1 may be incorrect,
  2403                              * if a[great] and pivot1 are floating-point zeros
  2404                              * of different signs. Therefore in float and
  2405                              * double sorting methods we have to use more
  2406                              * accurate assignment a[less] = a[great].
  2407                              */
  2408                             a[less] = a[great];
  2409                             ++less;
  2410                         } else { // pivot1 < a[great] < pivot2
  2411                             a[k] = a[great];
  2412                         }
  2413                         a[great] = ak;
  2414                         --great;
  2415                     }
  2416                 }
  2417             }
  2418 
  2419             // Sort center part recursively
  2420             sort(a, less, great, false);
  2421 
  2422         } else { // Partitioning with one pivot
  2423             /*
  2424              * Use the third of the five sorted elements as pivot.
  2425              * This value is inexpensive approximation of the median.
  2426              */
  2427             float pivot = a[e3];
  2428 
  2429             /*
  2430              * Partitioning degenerates to the traditional 3-way
  2431              * (or "Dutch National Flag") schema:
  2432              *
  2433              *   left part    center part              right part
  2434              * +-------------------------------------------------+
  2435              * |  < pivot  |   == pivot   |     ?    |  > pivot  |
  2436              * +-------------------------------------------------+
  2437              *              ^              ^        ^
  2438              *              |              |        |
  2439              *             less            k      great
  2440              *
  2441              * Invariants:
  2442              *
  2443              *   all in (left, less)   < pivot
  2444              *   all in [less, k)     == pivot
  2445              *   all in (great, right) > pivot
  2446              *
  2447              * Pointer k is the first index of ?-part.
  2448              */
  2449             for (int k = less; k <= great; ++k) {
  2450                 if (a[k] == pivot) {
  2451                     continue;
  2452                 }
  2453                 float ak = a[k];
  2454                 if (ak < pivot) { // Move a[k] to left part
  2455                     a[k] = a[less];
  2456                     a[less] = ak;
  2457                     ++less;
  2458                 } else { // a[k] > pivot - Move a[k] to right part
  2459                     while (a[great] > pivot) {
  2460                         --great;
  2461                     }
  2462                     if (a[great] < pivot) { // a[great] <= pivot
  2463                         a[k] = a[less];
  2464                         a[less] = a[great];
  2465                         ++less;
  2466                     } else { // a[great] == pivot
  2467                         /*
  2468                          * Even though a[great] equals to pivot, the
  2469                          * assignment a[k] = pivot may be incorrect,
  2470                          * if a[great] and pivot are floating-point
  2471                          * zeros of different signs. Therefore in float
  2472                          * and double sorting methods we have to use
  2473                          * more accurate assignment a[k] = a[great].
  2474                          */
  2475                         a[k] = a[great];
  2476                     }
  2477                     a[great] = ak;
  2478                     --great;
  2479                 }
  2480             }
  2481 
  2482             /*
  2483              * Sort left and right parts recursively.
  2484              * All elements from center part are equal
  2485              * and, therefore, already sorted.
  2486              */
  2487             sort(a, left, less - 1, leftmost);
  2488             sort(a, great + 1, right, false);
  2489         }
  2490     }
  2491 
  2492     /**
  2493      * Sorts the specified array.
  2494      *
  2495      * @param a the array to be sorted
  2496      */
  2497     public static void sort(double[] a) {
  2498         sort(a, 0, a.length - 1);
  2499     }
  2500 
  2501     /**
  2502      * Sorts the specified range of the array.
  2503      *
  2504      * @param a the array to be sorted
  2505      * @param left the index of the first element, inclusive, to be sorted
  2506      * @param right the index of the last element, inclusive, to be sorted
  2507      */
  2508     public static void sort(double[] a, int left, int right) {
  2509         /*
  2510          * Phase 1: Move NaNs to the end of the array.
  2511          */
  2512         while (left <= right && Double.isNaN(a[right])) {
  2513             --right;
  2514         }
  2515         for (int k = right; --k >= left; ) {
  2516             double ak = a[k];
  2517             if (ak != ak) { // a[k] is NaN
  2518                 a[k] = a[right];
  2519                 a[right] = ak;
  2520                 --right;
  2521             }
  2522         }
  2523 
  2524         /*
  2525          * Phase 2: Sort everything except NaNs (which are already in place).
  2526          */
  2527         doSort(a, left, right);
  2528 
  2529         /*
  2530          * Phase 3: Place negative zeros before positive zeros.
  2531          */
  2532         int hi = right;
  2533 
  2534         /*
  2535          * Find the first zero, or first positive, or last negative element.
  2536          */
  2537         while (left < hi) {
  2538             int middle = (left + hi) >>> 1;
  2539             double middleValue = a[middle];
  2540 
  2541             if (middleValue < 0.0d) {
  2542                 left = middle + 1;
  2543             } else {
  2544                 hi = middle;
  2545             }
  2546         }
  2547 
  2548         /*
  2549          * Skip the last negative value (if any) or all leading negative zeros.
  2550          */
  2551         while (left <= right && Double.doubleToRawLongBits(a[left]) < 0) {
  2552             ++left;
  2553         }
  2554 
  2555         /*
  2556          * Move negative zeros to the beginning of the sub-range.
  2557          *
  2558          * Partitioning:
  2559          *
  2560          * +----------------------------------------------------+
  2561          * |   < 0.0   |   -0.0   |   0.0   |   ?  ( >= 0.0 )   |
  2562          * +----------------------------------------------------+
  2563          *              ^          ^         ^
  2564          *              |          |         |
  2565          *             left        p         k
  2566          *
  2567          * Invariants:
  2568          *
  2569          *   all in (*,  left)  <  0.0
  2570          *   all in [left,  p) == -0.0
  2571          *   all in [p,     k) ==  0.0
  2572          *   all in [k, right] >=  0.0
  2573          *
  2574          * Pointer k is the first index of ?-part.
  2575          */
  2576         for (int k = left, p = left - 1; ++k <= right; ) {
  2577             double ak = a[k];
  2578             if (ak != 0.0d) {
  2579                 break;
  2580             }
  2581             if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d
  2582                 a[k] = 0.0d;
  2583                 a[++p] = -0.0d;
  2584             }
  2585         }
  2586     }
  2587 
  2588     /**
  2589      * Sorts the specified range of the array.
  2590      *
  2591      * @param a the array to be sorted
  2592      * @param left the index of the first element, inclusive, to be sorted
  2593      * @param right the index of the last element, inclusive, to be sorted
  2594      */
  2595     private static void doSort(double[] a, int left, int right) {
  2596         // Use Quicksort on small arrays
  2597         if (right - left < QUICKSORT_THRESHOLD) {
  2598             sort(a, left, right, true);
  2599             return;
  2600         }
  2601 
  2602         /*
  2603          * Index run[i] is the start of i-th run
  2604          * (ascending or descending sequence).
  2605          */
  2606         int[] run = new int[MAX_RUN_COUNT + 1];
  2607         int count = 0; run[0] = left;
  2608 
  2609         // Check if the array is nearly sorted
  2610         for (int k = left; k < right; run[count] = k) {
  2611             if (a[k] < a[k + 1]) { // ascending
  2612                 while (++k <= right && a[k - 1] <= a[k]);
  2613             } else if (a[k] > a[k + 1]) { // descending
  2614                 while (++k <= right && a[k - 1] >= a[k]);
  2615                 for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
  2616                     double t = a[lo]; a[lo] = a[hi]; a[hi] = t;
  2617                 }
  2618             } else { // equal
  2619                 for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
  2620                     if (--m == 0) {
  2621                         sort(a, left, right, true);
  2622                         return;
  2623                     }
  2624                 }
  2625             }
  2626 
  2627             /*
  2628              * The array is not highly structured,
  2629              * use Quicksort instead of merge sort.
  2630              */
  2631             if (++count == MAX_RUN_COUNT) {
  2632                 sort(a, left, right, true);
  2633                 return;
  2634             }
  2635         }
  2636 
  2637         // Check special cases
  2638         if (run[count] == right++) { // The last run contains one element
  2639             run[++count] = right;
  2640         } else if (count == 1) { // The array is already sorted
  2641             return;
  2642         }
  2643 
  2644         /*
  2645          * Create temporary array, which is used for merging.
  2646          * Implementation note: variable "right" is increased by 1.
  2647          */
  2648         double[] b; byte odd = 0;
  2649         for (int n = 1; (n <<= 1) < count; odd ^= 1);
  2650 
  2651         if (odd == 0) {
  2652             b = a; a = new double[b.length];
  2653             for (int i = left - 1; ++i < right; a[i] = b[i]);
  2654         } else {
  2655             b = new double[a.length];
  2656         }
  2657 
  2658         // Merging
  2659         for (int last; count > 1; count = last) {
  2660             for (int k = (last = 0) + 2; k <= count; k += 2) {
  2661                 int hi = run[k], mi = run[k - 1];
  2662                 for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
  2663                     if (q >= hi || p < mi && a[p] <= a[q]) {
  2664                         b[i] = a[p++];
  2665                     } else {
  2666                         b[i] = a[q++];
  2667                     }
  2668                 }
  2669                 run[++last] = hi;
  2670             }
  2671             if ((count & 1) != 0) {
  2672                 for (int i = right, lo = run[count - 1]; --i >= lo;
  2673                     b[i] = a[i]
  2674                 );
  2675                 run[++last] = right;
  2676             }
  2677             double[] t = a; a = b; b = t;
  2678         }
  2679     }
  2680 
  2681     /**
  2682      * Sorts the specified range of the array by Dual-Pivot Quicksort.
  2683      *
  2684      * @param a the array to be sorted
  2685      * @param left the index of the first element, inclusive, to be sorted
  2686      * @param right the index of the last element, inclusive, to be sorted
  2687      * @param leftmost indicates if this part is the leftmost in the range
  2688      */
  2689     private static void sort(double[] a, int left, int right, boolean leftmost) {
  2690         int length = right - left + 1;
  2691 
  2692         // Use insertion sort on tiny arrays
  2693         if (length < INSERTION_SORT_THRESHOLD) {
  2694             if (leftmost) {
  2695                 /*
  2696                  * Traditional (without sentinel) insertion sort,
  2697                  * optimized for server VM, is used in case of
  2698                  * the leftmost part.
  2699                  */
  2700                 for (int i = left, j = i; i < right; j = ++i) {
  2701                     double ai = a[i + 1];
  2702                     while (ai < a[j]) {
  2703                         a[j + 1] = a[j];
  2704                         if (j-- == left) {
  2705                             break;
  2706                         }
  2707                     }
  2708                     a[j + 1] = ai;
  2709                 }
  2710             } else {
  2711                 /*
  2712                  * Skip the longest ascending sequence.
  2713                  */
  2714                 do {
  2715                     if (left >= right) {
  2716                         return;
  2717                     }
  2718                 } while (a[++left] >= a[left - 1]);
  2719 
  2720                 /*
  2721                  * Every element from adjoining part plays the role
  2722                  * of sentinel, therefore this allows us to avoid the
  2723                  * left range check on each iteration. Moreover, we use
  2724                  * the more optimized algorithm, so called pair insertion
  2725                  * sort, which is faster (in the context of Quicksort)
  2726                  * than traditional implementation of insertion sort.
  2727                  */
  2728                 for (int k = left; ++left <= right; k = ++left) {
  2729                     double a1 = a[k], a2 = a[left];
  2730 
  2731                     if (a1 < a2) {
  2732                         a2 = a1; a1 = a[left];
  2733                     }
  2734                     while (a1 < a[--k]) {
  2735                         a[k + 2] = a[k];
  2736                     }
  2737                     a[++k + 1] = a1;
  2738 
  2739                     while (a2 < a[--k]) {
  2740                         a[k + 1] = a[k];
  2741                     }
  2742                     a[k + 1] = a2;
  2743                 }
  2744                 double last = a[right];
  2745 
  2746                 while (last < a[--right]) {
  2747                     a[right + 1] = a[right];
  2748                 }
  2749                 a[right + 1] = last;
  2750             }
  2751             return;
  2752         }
  2753 
  2754         // Inexpensive approximation of length / 7
  2755         int seventh = (length >> 3) + (length >> 6) + 1;
  2756 
  2757         /*
  2758          * Sort five evenly spaced elements around (and including) the
  2759          * center element in the range. These elements will be used for
  2760          * pivot selection as described below. The choice for spacing
  2761          * these elements was empirically determined to work well on
  2762          * a wide variety of inputs.
  2763          */
  2764         int e3 = (left + right) >>> 1; // The midpoint
  2765         int e2 = e3 - seventh;
  2766         int e1 = e2 - seventh;
  2767         int e4 = e3 + seventh;
  2768         int e5 = e4 + seventh;
  2769 
  2770         // Sort these elements using insertion sort
  2771         if (a[e2] < a[e1]) { double t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
  2772 
  2773         if (a[e3] < a[e2]) { double t = a[e3]; a[e3] = a[e2]; a[e2] = t;
  2774             if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  2775         }
  2776         if (a[e4] < a[e3]) { double t = a[e4]; a[e4] = a[e3]; a[e3] = t;
  2777             if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
  2778                 if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  2779             }
  2780         }
  2781         if (a[e5] < a[e4]) { double t = a[e5]; a[e5] = a[e4]; a[e4] = t;
  2782             if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
  2783                 if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
  2784                     if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
  2785                 }
  2786             }
  2787         }
  2788 
  2789         // Pointers
  2790         int less  = left;  // The index of the first element of center part
  2791         int great = right; // The index before the first element of right part
  2792 
  2793         if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
  2794             /*
  2795              * Use the second and fourth of the five sorted elements as pivots.
  2796              * These values are inexpensive approximations of the first and
  2797              * second terciles of the array. Note that pivot1 <= pivot2.
  2798              */
  2799             double pivot1 = a[e2];
  2800             double pivot2 = a[e4];
  2801 
  2802             /*
  2803              * The first and the last elements to be sorted are moved to the
  2804              * locations formerly occupied by the pivots. When partitioning
  2805              * is complete, the pivots are swapped back into their final
  2806              * positions, and excluded from subsequent sorting.
  2807              */
  2808             a[e2] = a[left];
  2809             a[e4] = a[right];
  2810 
  2811             /*
  2812              * Skip elements, which are less or greater than pivot values.
  2813              */
  2814             while (a[++less] < pivot1);
  2815             while (a[--great] > pivot2);
  2816 
  2817             /*
  2818              * Partitioning:
  2819              *
  2820              *   left part           center part                   right part
  2821              * +--------------------------------------------------------------+
  2822              * |  < pivot1  |  pivot1 <= && <= pivot2  |    ?    |  > pivot2  |
  2823              * +--------------------------------------------------------------+
  2824              *               ^                          ^       ^
  2825              *               |                          |       |
  2826              *              less                        k     great
  2827              *
  2828              * Invariants:
  2829              *
  2830              *              all in (left, less)   < pivot1
  2831              *    pivot1 <= all in [less, k)     <= pivot2
  2832              *              all in (great, right) > pivot2
  2833              *
  2834              * Pointer k is the first index of ?-part.
  2835              */
  2836             outer:
  2837             for (int k = less - 1; ++k <= great; ) {
  2838                 double ak = a[k];
  2839                 if (ak < pivot1) { // Move a[k] to left part
  2840                     a[k] = a[less];
  2841                     /*
  2842                      * Here and below we use "a[i] = b; i++;" instead
  2843                      * of "a[i++] = b;" due to performance issue.
  2844                      */
  2845                     a[less] = ak;
  2846                     ++less;
  2847                 } else if (ak > pivot2) { // Move a[k] to right part
  2848                     while (a[great] > pivot2) {
  2849                         if (great-- == k) {
  2850                             break outer;
  2851                         }
  2852                     }
  2853                     if (a[great] < pivot1) { // a[great] <= pivot2
  2854                         a[k] = a[less];
  2855                         a[less] = a[great];
  2856                         ++less;
  2857                     } else { // pivot1 <= a[great] <= pivot2
  2858                         a[k] = a[great];
  2859                     }
  2860                     /*
  2861                      * Here and below we use "a[i] = b; i--;" instead
  2862                      * of "a[i--] = b;" due to performance issue.
  2863                      */
  2864                     a[great] = ak;
  2865                     --great;
  2866                 }
  2867             }
  2868 
  2869             // Swap pivots into their final positions
  2870             a[left]  = a[less  - 1]; a[less  - 1] = pivot1;
  2871             a[right] = a[great + 1]; a[great + 1] = pivot2;
  2872 
  2873             // Sort left and right parts recursively, excluding known pivots
  2874             sort(a, left, less - 2, leftmost);
  2875             sort(a, great + 2, right, false);
  2876 
  2877             /*
  2878              * If center part is too large (comprises > 4/7 of the array),
  2879              * swap internal pivot values to ends.
  2880              */
  2881             if (less < e1 && e5 < great) {
  2882                 /*
  2883                  * Skip elements, which are equal to pivot values.
  2884                  */
  2885                 while (a[less] == pivot1) {
  2886                     ++less;
  2887                 }
  2888 
  2889                 while (a[great] == pivot2) {
  2890                     --great;
  2891                 }
  2892 
  2893                 /*
  2894                  * Partitioning:
  2895                  *
  2896                  *   left part         center part                  right part
  2897                  * +----------------------------------------------------------+
  2898                  * | == pivot1 |  pivot1 < && < pivot2  |    ?    | == pivot2 |
  2899                  * +----------------------------------------------------------+
  2900                  *              ^                        ^       ^
  2901                  *              |                        |       |
  2902                  *             less                      k     great
  2903                  *
  2904                  * Invariants:
  2905                  *
  2906                  *              all in (*,  less) == pivot1
  2907                  *     pivot1 < all in [less,  k)  < pivot2
  2908                  *              all in (great, *) == pivot2
  2909                  *
  2910                  * Pointer k is the first index of ?-part.
  2911                  */
  2912                 outer:
  2913                 for (int k = less - 1; ++k <= great; ) {
  2914                     double ak = a[k];
  2915                     if (ak == pivot1) { // Move a[k] to left part
  2916                         a[k] = a[less];
  2917                         a[less] = ak;
  2918                         ++less;
  2919                     } else if (ak == pivot2) { // Move a[k] to right part
  2920                         while (a[great] == pivot2) {
  2921                             if (great-- == k) {
  2922                                 break outer;
  2923                             }
  2924                         }
  2925                         if (a[great] == pivot1) { // a[great] < pivot2
  2926                             a[k] = a[less];
  2927                             /*
  2928                              * Even though a[great] equals to pivot1, the
  2929                              * assignment a[less] = pivot1 may be incorrect,
  2930                              * if a[great] and pivot1 are floating-point zeros
  2931                              * of different signs. Therefore in float and
  2932                              * double sorting methods we have to use more
  2933                              * accurate assignment a[less] = a[great].
  2934                              */
  2935                             a[less] = a[great];
  2936                             ++less;
  2937                         } else { // pivot1 < a[great] < pivot2
  2938                             a[k] = a[great];
  2939                         }
  2940                         a[great] = ak;
  2941                         --great;
  2942                     }
  2943                 }
  2944             }
  2945 
  2946             // Sort center part recursively
  2947             sort(a, less, great, false);
  2948 
  2949         } else { // Partitioning with one pivot
  2950             /*
  2951              * Use the third of the five sorted elements as pivot.
  2952              * This value is inexpensive approximation of the median.
  2953              */
  2954             double pivot = a[e3];
  2955 
  2956             /*
  2957              * Partitioning degenerates to the traditional 3-way
  2958              * (or "Dutch National Flag") schema:
  2959              *
  2960              *   left part    center part              right part
  2961              * +-------------------------------------------------+
  2962              * |  < pivot  |   == pivot   |     ?    |  > pivot  |
  2963              * +-------------------------------------------------+
  2964              *              ^              ^        ^
  2965              *              |              |        |
  2966              *             less            k      great
  2967              *
  2968              * Invariants:
  2969              *
  2970              *   all in (left, less)   < pivot
  2971              *   all in [less, k)     == pivot
  2972              *   all in (great, right) > pivot
  2973              *
  2974              * Pointer k is the first index of ?-part.
  2975              */
  2976             for (int k = less; k <= great; ++k) {
  2977                 if (a[k] == pivot) {
  2978                     continue;
  2979                 }
  2980                 double ak = a[k];
  2981                 if (ak < pivot) { // Move a[k] to left part
  2982                     a[k] = a[less];
  2983                     a[less] = ak;
  2984                     ++less;
  2985                 } else { // a[k] > pivot - Move a[k] to right part
  2986                     while (a[great] > pivot) {
  2987                         --great;
  2988                     }
  2989                     if (a[great] < pivot) { // a[great] <= pivot
  2990                         a[k] = a[less];
  2991                         a[less] = a[great];
  2992                         ++less;
  2993                     } else { // a[great] == pivot
  2994                         /*
  2995                          * Even though a[great] equals to pivot, the
  2996                          * assignment a[k] = pivot may be incorrect,
  2997                          * if a[great] and pivot are floating-point
  2998                          * zeros of different signs. Therefore in float
  2999                          * and double sorting methods we have to use
  3000                          * more accurate assignment a[k] = a[great].
  3001                          */
  3002                         a[k] = a[great];
  3003                     }
  3004                     a[great] = ak;
  3005                     --great;
  3006                 }
  3007             }
  3008 
  3009             /*
  3010              * Sort left and right parts recursively.
  3011              * All elements from center part are equal
  3012              * and, therefore, already sorted.
  3013              */
  3014             sort(a, left, less - 1, leftmost);
  3015             sort(a, great + 1, right, false);
  3016         }
  3017     }
  3018 }