History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/util/DualPivotQuicksort.java (1 of 18352 files). Show all

Unified · Split

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