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