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 }