1.1 --- a/emul/compact/src/main/java/java/util/DualPivotQuicksort.java Fri Mar 22 16:59:47 2013 +0100
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,3018 +0,0 @@
1.4 -/*
1.5 - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
1.6 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1.7 - *
1.8 - * This code is free software; you can redistribute it and/or modify it
1.9 - * under the terms of the GNU General Public License version 2 only, as
1.10 - * published by the Free Software Foundation. Oracle designates this
1.11 - * particular file as subject to the "Classpath" exception as provided
1.12 - * by Oracle in the LICENSE file that accompanied this code.
1.13 - *
1.14 - * This code is distributed in the hope that it will be useful, but WITHOUT
1.15 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1.16 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1.17 - * version 2 for more details (a copy is included in the LICENSE file that
1.18 - * accompanied this code).
1.19 - *
1.20 - * You should have received a copy of the GNU General Public License version
1.21 - * 2 along with this work; if not, write to the Free Software Foundation,
1.22 - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1.23 - *
1.24 - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1.25 - * or visit www.oracle.com if you need additional information or have any
1.26 - * questions.
1.27 - */
1.28 -
1.29 -package java.util;
1.30 -
1.31 -/**
1.32 - * This class implements the Dual-Pivot Quicksort algorithm by
1.33 - * Vladimir Yaroslavskiy, Jon Bentley, and Josh Bloch. The algorithm
1.34 - * offers O(n log(n)) performance on many data sets that cause other
1.35 - * quicksorts to degrade to quadratic performance, and is typically
1.36 - * faster than traditional (one-pivot) Quicksort implementations.
1.37 - *
1.38 - * @author Vladimir Yaroslavskiy
1.39 - * @author Jon Bentley
1.40 - * @author Josh Bloch
1.41 - *
1.42 - * @version 2011.02.11 m765.827.12i:5\7pm
1.43 - * @since 1.7
1.44 - */
1.45 -final class DualPivotQuicksort {
1.46 -
1.47 - /**
1.48 - * Prevents instantiation.
1.49 - */
1.50 - private DualPivotQuicksort() {}
1.51 -
1.52 - /*
1.53 - * Tuning parameters.
1.54 - */
1.55 -
1.56 - /**
1.57 - * The maximum number of runs in merge sort.
1.58 - */
1.59 - private static final int MAX_RUN_COUNT = 67;
1.60 -
1.61 - /**
1.62 - * The maximum length of run in merge sort.
1.63 - */
1.64 - private static final int MAX_RUN_LENGTH = 33;
1.65 -
1.66 - /**
1.67 - * If the length of an array to be sorted is less than this
1.68 - * constant, Quicksort is used in preference to merge sort.
1.69 - */
1.70 - private static final int QUICKSORT_THRESHOLD = 286;
1.71 -
1.72 - /**
1.73 - * If the length of an array to be sorted is less than this
1.74 - * constant, insertion sort is used in preference to Quicksort.
1.75 - */
1.76 - private static final int INSERTION_SORT_THRESHOLD = 47;
1.77 -
1.78 - /**
1.79 - * If the length of a byte array to be sorted is greater than this
1.80 - * constant, counting sort is used in preference to insertion sort.
1.81 - */
1.82 - private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 29;
1.83 -
1.84 - /**
1.85 - * If the length of a short or char array to be sorted is greater
1.86 - * than this constant, counting sort is used in preference to Quicksort.
1.87 - */
1.88 - private static final int COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR = 3200;
1.89 -
1.90 - /*
1.91 - * Sorting methods for seven primitive types.
1.92 - */
1.93 -
1.94 - /**
1.95 - * Sorts the specified array.
1.96 - *
1.97 - * @param a the array to be sorted
1.98 - */
1.99 - public static void sort(int[] a) {
1.100 - sort(a, 0, a.length - 1);
1.101 - }
1.102 -
1.103 - /**
1.104 - * Sorts the specified range of the array.
1.105 - *
1.106 - * @param a the array to be sorted
1.107 - * @param left the index of the first element, inclusive, to be sorted
1.108 - * @param right the index of the last element, inclusive, to be sorted
1.109 - */
1.110 - public static void sort(int[] a, int left, int right) {
1.111 - // Use Quicksort on small arrays
1.112 - if (right - left < QUICKSORT_THRESHOLD) {
1.113 - sort(a, left, right, true);
1.114 - return;
1.115 - }
1.116 -
1.117 - /*
1.118 - * Index run[i] is the start of i-th run
1.119 - * (ascending or descending sequence).
1.120 - */
1.121 - int[] run = new int[MAX_RUN_COUNT + 1];
1.122 - int count = 0; run[0] = left;
1.123 -
1.124 - // Check if the array is nearly sorted
1.125 - for (int k = left; k < right; run[count] = k) {
1.126 - if (a[k] < a[k + 1]) { // ascending
1.127 - while (++k <= right && a[k - 1] <= a[k]);
1.128 - } else if (a[k] > a[k + 1]) { // descending
1.129 - while (++k <= right && a[k - 1] >= a[k]);
1.130 - for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
1.131 - int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
1.132 - }
1.133 - } else { // equal
1.134 - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
1.135 - if (--m == 0) {
1.136 - sort(a, left, right, true);
1.137 - return;
1.138 - }
1.139 - }
1.140 - }
1.141 -
1.142 - /*
1.143 - * The array is not highly structured,
1.144 - * use Quicksort instead of merge sort.
1.145 - */
1.146 - if (++count == MAX_RUN_COUNT) {
1.147 - sort(a, left, right, true);
1.148 - return;
1.149 - }
1.150 - }
1.151 -
1.152 - // Check special cases
1.153 - if (run[count] == right++) { // The last run contains one element
1.154 - run[++count] = right;
1.155 - } else if (count == 1) { // The array is already sorted
1.156 - return;
1.157 - }
1.158 -
1.159 - /*
1.160 - * Create temporary array, which is used for merging.
1.161 - * Implementation note: variable "right" is increased by 1.
1.162 - */
1.163 - int[] b; byte odd = 0;
1.164 - for (int n = 1; (n <<= 1) < count; odd ^= 1);
1.165 -
1.166 - if (odd == 0) {
1.167 - b = a; a = new int[b.length];
1.168 - for (int i = left - 1; ++i < right; a[i] = b[i]);
1.169 - } else {
1.170 - b = new int[a.length];
1.171 - }
1.172 -
1.173 - // Merging
1.174 - for (int last; count > 1; count = last) {
1.175 - for (int k = (last = 0) + 2; k <= count; k += 2) {
1.176 - int hi = run[k], mi = run[k - 1];
1.177 - for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
1.178 - if (q >= hi || p < mi && a[p] <= a[q]) {
1.179 - b[i] = a[p++];
1.180 - } else {
1.181 - b[i] = a[q++];
1.182 - }
1.183 - }
1.184 - run[++last] = hi;
1.185 - }
1.186 - if ((count & 1) != 0) {
1.187 - for (int i = right, lo = run[count - 1]; --i >= lo;
1.188 - b[i] = a[i]
1.189 - );
1.190 - run[++last] = right;
1.191 - }
1.192 - int[] t = a; a = b; b = t;
1.193 - }
1.194 - }
1.195 -
1.196 - /**
1.197 - * Sorts the specified range of the array by Dual-Pivot Quicksort.
1.198 - *
1.199 - * @param a the array to be sorted
1.200 - * @param left the index of the first element, inclusive, to be sorted
1.201 - * @param right the index of the last element, inclusive, to be sorted
1.202 - * @param leftmost indicates if this part is the leftmost in the range
1.203 - */
1.204 - private static void sort(int[] a, int left, int right, boolean leftmost) {
1.205 - int length = right - left + 1;
1.206 -
1.207 - // Use insertion sort on tiny arrays
1.208 - if (length < INSERTION_SORT_THRESHOLD) {
1.209 - if (leftmost) {
1.210 - /*
1.211 - * Traditional (without sentinel) insertion sort,
1.212 - * optimized for server VM, is used in case of
1.213 - * the leftmost part.
1.214 - */
1.215 - for (int i = left, j = i; i < right; j = ++i) {
1.216 - int ai = a[i + 1];
1.217 - while (ai < a[j]) {
1.218 - a[j + 1] = a[j];
1.219 - if (j-- == left) {
1.220 - break;
1.221 - }
1.222 - }
1.223 - a[j + 1] = ai;
1.224 - }
1.225 - } else {
1.226 - /*
1.227 - * Skip the longest ascending sequence.
1.228 - */
1.229 - do {
1.230 - if (left >= right) {
1.231 - return;
1.232 - }
1.233 - } while (a[++left] >= a[left - 1]);
1.234 -
1.235 - /*
1.236 - * Every element from adjoining part plays the role
1.237 - * of sentinel, therefore this allows us to avoid the
1.238 - * left range check on each iteration. Moreover, we use
1.239 - * the more optimized algorithm, so called pair insertion
1.240 - * sort, which is faster (in the context of Quicksort)
1.241 - * than traditional implementation of insertion sort.
1.242 - */
1.243 - for (int k = left; ++left <= right; k = ++left) {
1.244 - int a1 = a[k], a2 = a[left];
1.245 -
1.246 - if (a1 < a2) {
1.247 - a2 = a1; a1 = a[left];
1.248 - }
1.249 - while (a1 < a[--k]) {
1.250 - a[k + 2] = a[k];
1.251 - }
1.252 - a[++k + 1] = a1;
1.253 -
1.254 - while (a2 < a[--k]) {
1.255 - a[k + 1] = a[k];
1.256 - }
1.257 - a[k + 1] = a2;
1.258 - }
1.259 - int last = a[right];
1.260 -
1.261 - while (last < a[--right]) {
1.262 - a[right + 1] = a[right];
1.263 - }
1.264 - a[right + 1] = last;
1.265 - }
1.266 - return;
1.267 - }
1.268 -
1.269 - // Inexpensive approximation of length / 7
1.270 - int seventh = (length >> 3) + (length >> 6) + 1;
1.271 -
1.272 - /*
1.273 - * Sort five evenly spaced elements around (and including) the
1.274 - * center element in the range. These elements will be used for
1.275 - * pivot selection as described below. The choice for spacing
1.276 - * these elements was empirically determined to work well on
1.277 - * a wide variety of inputs.
1.278 - */
1.279 - int e3 = (left + right) >>> 1; // The midpoint
1.280 - int e2 = e3 - seventh;
1.281 - int e1 = e2 - seventh;
1.282 - int e4 = e3 + seventh;
1.283 - int e5 = e4 + seventh;
1.284 -
1.285 - // Sort these elements using insertion sort
1.286 - if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
1.287 -
1.288 - if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t;
1.289 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.290 - }
1.291 - if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t;
1.292 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.293 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.294 - }
1.295 - }
1.296 - if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t;
1.297 - if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
1.298 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.299 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.300 - }
1.301 - }
1.302 - }
1.303 -
1.304 - // Pointers
1.305 - int less = left; // The index of the first element of center part
1.306 - int great = right; // The index before the first element of right part
1.307 -
1.308 - if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
1.309 - /*
1.310 - * Use the second and fourth of the five sorted elements as pivots.
1.311 - * These values are inexpensive approximations of the first and
1.312 - * second terciles of the array. Note that pivot1 <= pivot2.
1.313 - */
1.314 - int pivot1 = a[e2];
1.315 - int pivot2 = a[e4];
1.316 -
1.317 - /*
1.318 - * The first and the last elements to be sorted are moved to the
1.319 - * locations formerly occupied by the pivots. When partitioning
1.320 - * is complete, the pivots are swapped back into their final
1.321 - * positions, and excluded from subsequent sorting.
1.322 - */
1.323 - a[e2] = a[left];
1.324 - a[e4] = a[right];
1.325 -
1.326 - /*
1.327 - * Skip elements, which are less or greater than pivot values.
1.328 - */
1.329 - while (a[++less] < pivot1);
1.330 - while (a[--great] > pivot2);
1.331 -
1.332 - /*
1.333 - * Partitioning:
1.334 - *
1.335 - * left part center part right part
1.336 - * +--------------------------------------------------------------+
1.337 - * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
1.338 - * +--------------------------------------------------------------+
1.339 - * ^ ^ ^
1.340 - * | | |
1.341 - * less k great
1.342 - *
1.343 - * Invariants:
1.344 - *
1.345 - * all in (left, less) < pivot1
1.346 - * pivot1 <= all in [less, k) <= pivot2
1.347 - * all in (great, right) > pivot2
1.348 - *
1.349 - * Pointer k is the first index of ?-part.
1.350 - */
1.351 - outer:
1.352 - for (int k = less - 1; ++k <= great; ) {
1.353 - int ak = a[k];
1.354 - if (ak < pivot1) { // Move a[k] to left part
1.355 - a[k] = a[less];
1.356 - /*
1.357 - * Here and below we use "a[i] = b; i++;" instead
1.358 - * of "a[i++] = b;" due to performance issue.
1.359 - */
1.360 - a[less] = ak;
1.361 - ++less;
1.362 - } else if (ak > pivot2) { // Move a[k] to right part
1.363 - while (a[great] > pivot2) {
1.364 - if (great-- == k) {
1.365 - break outer;
1.366 - }
1.367 - }
1.368 - if (a[great] < pivot1) { // a[great] <= pivot2
1.369 - a[k] = a[less];
1.370 - a[less] = a[great];
1.371 - ++less;
1.372 - } else { // pivot1 <= a[great] <= pivot2
1.373 - a[k] = a[great];
1.374 - }
1.375 - /*
1.376 - * Here and below we use "a[i] = b; i--;" instead
1.377 - * of "a[i--] = b;" due to performance issue.
1.378 - */
1.379 - a[great] = ak;
1.380 - --great;
1.381 - }
1.382 - }
1.383 -
1.384 - // Swap pivots into their final positions
1.385 - a[left] = a[less - 1]; a[less - 1] = pivot1;
1.386 - a[right] = a[great + 1]; a[great + 1] = pivot2;
1.387 -
1.388 - // Sort left and right parts recursively, excluding known pivots
1.389 - sort(a, left, less - 2, leftmost);
1.390 - sort(a, great + 2, right, false);
1.391 -
1.392 - /*
1.393 - * If center part is too large (comprises > 4/7 of the array),
1.394 - * swap internal pivot values to ends.
1.395 - */
1.396 - if (less < e1 && e5 < great) {
1.397 - /*
1.398 - * Skip elements, which are equal to pivot values.
1.399 - */
1.400 - while (a[less] == pivot1) {
1.401 - ++less;
1.402 - }
1.403 -
1.404 - while (a[great] == pivot2) {
1.405 - --great;
1.406 - }
1.407 -
1.408 - /*
1.409 - * Partitioning:
1.410 - *
1.411 - * left part center part right part
1.412 - * +----------------------------------------------------------+
1.413 - * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
1.414 - * +----------------------------------------------------------+
1.415 - * ^ ^ ^
1.416 - * | | |
1.417 - * less k great
1.418 - *
1.419 - * Invariants:
1.420 - *
1.421 - * all in (*, less) == pivot1
1.422 - * pivot1 < all in [less, k) < pivot2
1.423 - * all in (great, *) == pivot2
1.424 - *
1.425 - * Pointer k is the first index of ?-part.
1.426 - */
1.427 - outer:
1.428 - for (int k = less - 1; ++k <= great; ) {
1.429 - int ak = a[k];
1.430 - if (ak == pivot1) { // Move a[k] to left part
1.431 - a[k] = a[less];
1.432 - a[less] = ak;
1.433 - ++less;
1.434 - } else if (ak == pivot2) { // Move a[k] to right part
1.435 - while (a[great] == pivot2) {
1.436 - if (great-- == k) {
1.437 - break outer;
1.438 - }
1.439 - }
1.440 - if (a[great] == pivot1) { // a[great] < pivot2
1.441 - a[k] = a[less];
1.442 - /*
1.443 - * Even though a[great] equals to pivot1, the
1.444 - * assignment a[less] = pivot1 may be incorrect,
1.445 - * if a[great] and pivot1 are floating-point zeros
1.446 - * of different signs. Therefore in float and
1.447 - * double sorting methods we have to use more
1.448 - * accurate assignment a[less] = a[great].
1.449 - */
1.450 - a[less] = pivot1;
1.451 - ++less;
1.452 - } else { // pivot1 < a[great] < pivot2
1.453 - a[k] = a[great];
1.454 - }
1.455 - a[great] = ak;
1.456 - --great;
1.457 - }
1.458 - }
1.459 - }
1.460 -
1.461 - // Sort center part recursively
1.462 - sort(a, less, great, false);
1.463 -
1.464 - } else { // Partitioning with one pivot
1.465 - /*
1.466 - * Use the third of the five sorted elements as pivot.
1.467 - * This value is inexpensive approximation of the median.
1.468 - */
1.469 - int pivot = a[e3];
1.470 -
1.471 - /*
1.472 - * Partitioning degenerates to the traditional 3-way
1.473 - * (or "Dutch National Flag") schema:
1.474 - *
1.475 - * left part center part right part
1.476 - * +-------------------------------------------------+
1.477 - * | < pivot | == pivot | ? | > pivot |
1.478 - * +-------------------------------------------------+
1.479 - * ^ ^ ^
1.480 - * | | |
1.481 - * less k great
1.482 - *
1.483 - * Invariants:
1.484 - *
1.485 - * all in (left, less) < pivot
1.486 - * all in [less, k) == pivot
1.487 - * all in (great, right) > pivot
1.488 - *
1.489 - * Pointer k is the first index of ?-part.
1.490 - */
1.491 - for (int k = less; k <= great; ++k) {
1.492 - if (a[k] == pivot) {
1.493 - continue;
1.494 - }
1.495 - int ak = a[k];
1.496 - if (ak < pivot) { // Move a[k] to left part
1.497 - a[k] = a[less];
1.498 - a[less] = ak;
1.499 - ++less;
1.500 - } else { // a[k] > pivot - Move a[k] to right part
1.501 - while (a[great] > pivot) {
1.502 - --great;
1.503 - }
1.504 - if (a[great] < pivot) { // a[great] <= pivot
1.505 - a[k] = a[less];
1.506 - a[less] = a[great];
1.507 - ++less;
1.508 - } else { // a[great] == pivot
1.509 - /*
1.510 - * Even though a[great] equals to pivot, the
1.511 - * assignment a[k] = pivot may be incorrect,
1.512 - * if a[great] and pivot are floating-point
1.513 - * zeros of different signs. Therefore in float
1.514 - * and double sorting methods we have to use
1.515 - * more accurate assignment a[k] = a[great].
1.516 - */
1.517 - a[k] = pivot;
1.518 - }
1.519 - a[great] = ak;
1.520 - --great;
1.521 - }
1.522 - }
1.523 -
1.524 - /*
1.525 - * Sort left and right parts recursively.
1.526 - * All elements from center part are equal
1.527 - * and, therefore, already sorted.
1.528 - */
1.529 - sort(a, left, less - 1, leftmost);
1.530 - sort(a, great + 1, right, false);
1.531 - }
1.532 - }
1.533 -
1.534 - /**
1.535 - * Sorts the specified array.
1.536 - *
1.537 - * @param a the array to be sorted
1.538 - */
1.539 - public static void sort(long[] a) {
1.540 - sort(a, 0, a.length - 1);
1.541 - }
1.542 -
1.543 - /**
1.544 - * Sorts the specified range of the array.
1.545 - *
1.546 - * @param a the array to be sorted
1.547 - * @param left the index of the first element, inclusive, to be sorted
1.548 - * @param right the index of the last element, inclusive, to be sorted
1.549 - */
1.550 - public static void sort(long[] a, int left, int right) {
1.551 - // Use Quicksort on small arrays
1.552 - if (right - left < QUICKSORT_THRESHOLD) {
1.553 - sort(a, left, right, true);
1.554 - return;
1.555 - }
1.556 -
1.557 - /*
1.558 - * Index run[i] is the start of i-th run
1.559 - * (ascending or descending sequence).
1.560 - */
1.561 - int[] run = new int[MAX_RUN_COUNT + 1];
1.562 - int count = 0; run[0] = left;
1.563 -
1.564 - // Check if the array is nearly sorted
1.565 - for (int k = left; k < right; run[count] = k) {
1.566 - if (a[k] < a[k + 1]) { // ascending
1.567 - while (++k <= right && a[k - 1] <= a[k]);
1.568 - } else if (a[k] > a[k + 1]) { // descending
1.569 - while (++k <= right && a[k - 1] >= a[k]);
1.570 - for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
1.571 - long t = a[lo]; a[lo] = a[hi]; a[hi] = t;
1.572 - }
1.573 - } else { // equal
1.574 - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
1.575 - if (--m == 0) {
1.576 - sort(a, left, right, true);
1.577 - return;
1.578 - }
1.579 - }
1.580 - }
1.581 -
1.582 - /*
1.583 - * The array is not highly structured,
1.584 - * use Quicksort instead of merge sort.
1.585 - */
1.586 - if (++count == MAX_RUN_COUNT) {
1.587 - sort(a, left, right, true);
1.588 - return;
1.589 - }
1.590 - }
1.591 -
1.592 - // Check special cases
1.593 - if (run[count] == right++) { // The last run contains one element
1.594 - run[++count] = right;
1.595 - } else if (count == 1) { // The array is already sorted
1.596 - return;
1.597 - }
1.598 -
1.599 - /*
1.600 - * Create temporary array, which is used for merging.
1.601 - * Implementation note: variable "right" is increased by 1.
1.602 - */
1.603 - long[] b; byte odd = 0;
1.604 - for (int n = 1; (n <<= 1) < count; odd ^= 1);
1.605 -
1.606 - if (odd == 0) {
1.607 - b = a; a = new long[b.length];
1.608 - for (int i = left - 1; ++i < right; a[i] = b[i]);
1.609 - } else {
1.610 - b = new long[a.length];
1.611 - }
1.612 -
1.613 - // Merging
1.614 - for (int last; count > 1; count = last) {
1.615 - for (int k = (last = 0) + 2; k <= count; k += 2) {
1.616 - int hi = run[k], mi = run[k - 1];
1.617 - for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
1.618 - if (q >= hi || p < mi && a[p] <= a[q]) {
1.619 - b[i] = a[p++];
1.620 - } else {
1.621 - b[i] = a[q++];
1.622 - }
1.623 - }
1.624 - run[++last] = hi;
1.625 - }
1.626 - if ((count & 1) != 0) {
1.627 - for (int i = right, lo = run[count - 1]; --i >= lo;
1.628 - b[i] = a[i]
1.629 - );
1.630 - run[++last] = right;
1.631 - }
1.632 - long[] t = a; a = b; b = t;
1.633 - }
1.634 - }
1.635 -
1.636 - /**
1.637 - * Sorts the specified range of the array by Dual-Pivot Quicksort.
1.638 - *
1.639 - * @param a the array to be sorted
1.640 - * @param left the index of the first element, inclusive, to be sorted
1.641 - * @param right the index of the last element, inclusive, to be sorted
1.642 - * @param leftmost indicates if this part is the leftmost in the range
1.643 - */
1.644 - private static void sort(long[] a, int left, int right, boolean leftmost) {
1.645 - int length = right - left + 1;
1.646 -
1.647 - // Use insertion sort on tiny arrays
1.648 - if (length < INSERTION_SORT_THRESHOLD) {
1.649 - if (leftmost) {
1.650 - /*
1.651 - * Traditional (without sentinel) insertion sort,
1.652 - * optimized for server VM, is used in case of
1.653 - * the leftmost part.
1.654 - */
1.655 - for (int i = left, j = i; i < right; j = ++i) {
1.656 - long ai = a[i + 1];
1.657 - while (ai < a[j]) {
1.658 - a[j + 1] = a[j];
1.659 - if (j-- == left) {
1.660 - break;
1.661 - }
1.662 - }
1.663 - a[j + 1] = ai;
1.664 - }
1.665 - } else {
1.666 - /*
1.667 - * Skip the longest ascending sequence.
1.668 - */
1.669 - do {
1.670 - if (left >= right) {
1.671 - return;
1.672 - }
1.673 - } while (a[++left] >= a[left - 1]);
1.674 -
1.675 - /*
1.676 - * Every element from adjoining part plays the role
1.677 - * of sentinel, therefore this allows us to avoid the
1.678 - * left range check on each iteration. Moreover, we use
1.679 - * the more optimized algorithm, so called pair insertion
1.680 - * sort, which is faster (in the context of Quicksort)
1.681 - * than traditional implementation of insertion sort.
1.682 - */
1.683 - for (int k = left; ++left <= right; k = ++left) {
1.684 - long a1 = a[k], a2 = a[left];
1.685 -
1.686 - if (a1 < a2) {
1.687 - a2 = a1; a1 = a[left];
1.688 - }
1.689 - while (a1 < a[--k]) {
1.690 - a[k + 2] = a[k];
1.691 - }
1.692 - a[++k + 1] = a1;
1.693 -
1.694 - while (a2 < a[--k]) {
1.695 - a[k + 1] = a[k];
1.696 - }
1.697 - a[k + 1] = a2;
1.698 - }
1.699 - long last = a[right];
1.700 -
1.701 - while (last < a[--right]) {
1.702 - a[right + 1] = a[right];
1.703 - }
1.704 - a[right + 1] = last;
1.705 - }
1.706 - return;
1.707 - }
1.708 -
1.709 - // Inexpensive approximation of length / 7
1.710 - int seventh = (length >> 3) + (length >> 6) + 1;
1.711 -
1.712 - /*
1.713 - * Sort five evenly spaced elements around (and including) the
1.714 - * center element in the range. These elements will be used for
1.715 - * pivot selection as described below. The choice for spacing
1.716 - * these elements was empirically determined to work well on
1.717 - * a wide variety of inputs.
1.718 - */
1.719 - int e3 = (left + right) >>> 1; // The midpoint
1.720 - int e2 = e3 - seventh;
1.721 - int e1 = e2 - seventh;
1.722 - int e4 = e3 + seventh;
1.723 - int e5 = e4 + seventh;
1.724 -
1.725 - // Sort these elements using insertion sort
1.726 - if (a[e2] < a[e1]) { long t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
1.727 -
1.728 - if (a[e3] < a[e2]) { long t = a[e3]; a[e3] = a[e2]; a[e2] = t;
1.729 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.730 - }
1.731 - if (a[e4] < a[e3]) { long t = a[e4]; a[e4] = a[e3]; a[e3] = t;
1.732 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.733 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.734 - }
1.735 - }
1.736 - if (a[e5] < a[e4]) { long t = a[e5]; a[e5] = a[e4]; a[e4] = t;
1.737 - if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
1.738 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.739 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.740 - }
1.741 - }
1.742 - }
1.743 -
1.744 - // Pointers
1.745 - int less = left; // The index of the first element of center part
1.746 - int great = right; // The index before the first element of right part
1.747 -
1.748 - if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
1.749 - /*
1.750 - * Use the second and fourth of the five sorted elements as pivots.
1.751 - * These values are inexpensive approximations of the first and
1.752 - * second terciles of the array. Note that pivot1 <= pivot2.
1.753 - */
1.754 - long pivot1 = a[e2];
1.755 - long pivot2 = a[e4];
1.756 -
1.757 - /*
1.758 - * The first and the last elements to be sorted are moved to the
1.759 - * locations formerly occupied by the pivots. When partitioning
1.760 - * is complete, the pivots are swapped back into their final
1.761 - * positions, and excluded from subsequent sorting.
1.762 - */
1.763 - a[e2] = a[left];
1.764 - a[e4] = a[right];
1.765 -
1.766 - /*
1.767 - * Skip elements, which are less or greater than pivot values.
1.768 - */
1.769 - while (a[++less] < pivot1);
1.770 - while (a[--great] > pivot2);
1.771 -
1.772 - /*
1.773 - * Partitioning:
1.774 - *
1.775 - * left part center part right part
1.776 - * +--------------------------------------------------------------+
1.777 - * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
1.778 - * +--------------------------------------------------------------+
1.779 - * ^ ^ ^
1.780 - * | | |
1.781 - * less k great
1.782 - *
1.783 - * Invariants:
1.784 - *
1.785 - * all in (left, less) < pivot1
1.786 - * pivot1 <= all in [less, k) <= pivot2
1.787 - * all in (great, right) > pivot2
1.788 - *
1.789 - * Pointer k is the first index of ?-part.
1.790 - */
1.791 - outer:
1.792 - for (int k = less - 1; ++k <= great; ) {
1.793 - long ak = a[k];
1.794 - if (ak < pivot1) { // Move a[k] to left part
1.795 - a[k] = a[less];
1.796 - /*
1.797 - * Here and below we use "a[i] = b; i++;" instead
1.798 - * of "a[i++] = b;" due to performance issue.
1.799 - */
1.800 - a[less] = ak;
1.801 - ++less;
1.802 - } else if (ak > pivot2) { // Move a[k] to right part
1.803 - while (a[great] > pivot2) {
1.804 - if (great-- == k) {
1.805 - break outer;
1.806 - }
1.807 - }
1.808 - if (a[great] < pivot1) { // a[great] <= pivot2
1.809 - a[k] = a[less];
1.810 - a[less] = a[great];
1.811 - ++less;
1.812 - } else { // pivot1 <= a[great] <= pivot2
1.813 - a[k] = a[great];
1.814 - }
1.815 - /*
1.816 - * Here and below we use "a[i] = b; i--;" instead
1.817 - * of "a[i--] = b;" due to performance issue.
1.818 - */
1.819 - a[great] = ak;
1.820 - --great;
1.821 - }
1.822 - }
1.823 -
1.824 - // Swap pivots into their final positions
1.825 - a[left] = a[less - 1]; a[less - 1] = pivot1;
1.826 - a[right] = a[great + 1]; a[great + 1] = pivot2;
1.827 -
1.828 - // Sort left and right parts recursively, excluding known pivots
1.829 - sort(a, left, less - 2, leftmost);
1.830 - sort(a, great + 2, right, false);
1.831 -
1.832 - /*
1.833 - * If center part is too large (comprises > 4/7 of the array),
1.834 - * swap internal pivot values to ends.
1.835 - */
1.836 - if (less < e1 && e5 < great) {
1.837 - /*
1.838 - * Skip elements, which are equal to pivot values.
1.839 - */
1.840 - while (a[less] == pivot1) {
1.841 - ++less;
1.842 - }
1.843 -
1.844 - while (a[great] == pivot2) {
1.845 - --great;
1.846 - }
1.847 -
1.848 - /*
1.849 - * Partitioning:
1.850 - *
1.851 - * left part center part right part
1.852 - * +----------------------------------------------------------+
1.853 - * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
1.854 - * +----------------------------------------------------------+
1.855 - * ^ ^ ^
1.856 - * | | |
1.857 - * less k great
1.858 - *
1.859 - * Invariants:
1.860 - *
1.861 - * all in (*, less) == pivot1
1.862 - * pivot1 < all in [less, k) < pivot2
1.863 - * all in (great, *) == pivot2
1.864 - *
1.865 - * Pointer k is the first index of ?-part.
1.866 - */
1.867 - outer:
1.868 - for (int k = less - 1; ++k <= great; ) {
1.869 - long ak = a[k];
1.870 - if (ak == pivot1) { // Move a[k] to left part
1.871 - a[k] = a[less];
1.872 - a[less] = ak;
1.873 - ++less;
1.874 - } else if (ak == pivot2) { // Move a[k] to right part
1.875 - while (a[great] == pivot2) {
1.876 - if (great-- == k) {
1.877 - break outer;
1.878 - }
1.879 - }
1.880 - if (a[great] == pivot1) { // a[great] < pivot2
1.881 - a[k] = a[less];
1.882 - /*
1.883 - * Even though a[great] equals to pivot1, the
1.884 - * assignment a[less] = pivot1 may be incorrect,
1.885 - * if a[great] and pivot1 are floating-point zeros
1.886 - * of different signs. Therefore in float and
1.887 - * double sorting methods we have to use more
1.888 - * accurate assignment a[less] = a[great].
1.889 - */
1.890 - a[less] = pivot1;
1.891 - ++less;
1.892 - } else { // pivot1 < a[great] < pivot2
1.893 - a[k] = a[great];
1.894 - }
1.895 - a[great] = ak;
1.896 - --great;
1.897 - }
1.898 - }
1.899 - }
1.900 -
1.901 - // Sort center part recursively
1.902 - sort(a, less, great, false);
1.903 -
1.904 - } else { // Partitioning with one pivot
1.905 - /*
1.906 - * Use the third of the five sorted elements as pivot.
1.907 - * This value is inexpensive approximation of the median.
1.908 - */
1.909 - long pivot = a[e3];
1.910 -
1.911 - /*
1.912 - * Partitioning degenerates to the traditional 3-way
1.913 - * (or "Dutch National Flag") schema:
1.914 - *
1.915 - * left part center part right part
1.916 - * +-------------------------------------------------+
1.917 - * | < pivot | == pivot | ? | > pivot |
1.918 - * +-------------------------------------------------+
1.919 - * ^ ^ ^
1.920 - * | | |
1.921 - * less k great
1.922 - *
1.923 - * Invariants:
1.924 - *
1.925 - * all in (left, less) < pivot
1.926 - * all in [less, k) == pivot
1.927 - * all in (great, right) > pivot
1.928 - *
1.929 - * Pointer k is the first index of ?-part.
1.930 - */
1.931 - for (int k = less; k <= great; ++k) {
1.932 - if (a[k] == pivot) {
1.933 - continue;
1.934 - }
1.935 - long ak = a[k];
1.936 - if (ak < pivot) { // Move a[k] to left part
1.937 - a[k] = a[less];
1.938 - a[less] = ak;
1.939 - ++less;
1.940 - } else { // a[k] > pivot - Move a[k] to right part
1.941 - while (a[great] > pivot) {
1.942 - --great;
1.943 - }
1.944 - if (a[great] < pivot) { // a[great] <= pivot
1.945 - a[k] = a[less];
1.946 - a[less] = a[great];
1.947 - ++less;
1.948 - } else { // a[great] == pivot
1.949 - /*
1.950 - * Even though a[great] equals to pivot, the
1.951 - * assignment a[k] = pivot may be incorrect,
1.952 - * if a[great] and pivot are floating-point
1.953 - * zeros of different signs. Therefore in float
1.954 - * and double sorting methods we have to use
1.955 - * more accurate assignment a[k] = a[great].
1.956 - */
1.957 - a[k] = pivot;
1.958 - }
1.959 - a[great] = ak;
1.960 - --great;
1.961 - }
1.962 - }
1.963 -
1.964 - /*
1.965 - * Sort left and right parts recursively.
1.966 - * All elements from center part are equal
1.967 - * and, therefore, already sorted.
1.968 - */
1.969 - sort(a, left, less - 1, leftmost);
1.970 - sort(a, great + 1, right, false);
1.971 - }
1.972 - }
1.973 -
1.974 - /**
1.975 - * Sorts the specified array.
1.976 - *
1.977 - * @param a the array to be sorted
1.978 - */
1.979 - public static void sort(short[] a) {
1.980 - sort(a, 0, a.length - 1);
1.981 - }
1.982 -
1.983 - /**
1.984 - * Sorts the specified range of the array.
1.985 - *
1.986 - * @param a the array to be sorted
1.987 - * @param left the index of the first element, inclusive, to be sorted
1.988 - * @param right the index of the last element, inclusive, to be sorted
1.989 - */
1.990 - public static void sort(short[] a, int left, int right) {
1.991 - // Use counting sort on large arrays
1.992 - if (right - left > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) {
1.993 - int[] count = new int[NUM_SHORT_VALUES];
1.994 -
1.995 - for (int i = left - 1; ++i <= right;
1.996 - count[a[i] - Short.MIN_VALUE]++
1.997 - );
1.998 - for (int i = NUM_SHORT_VALUES, k = right + 1; k > left; ) {
1.999 - while (count[--i] == 0);
1.1000 - short value = (short) (i + Short.MIN_VALUE);
1.1001 - int s = count[i];
1.1002 -
1.1003 - do {
1.1004 - a[--k] = value;
1.1005 - } while (--s > 0);
1.1006 - }
1.1007 - } else { // Use Dual-Pivot Quicksort on small arrays
1.1008 - doSort(a, left, right);
1.1009 - }
1.1010 - }
1.1011 -
1.1012 - /** The number of distinct short values. */
1.1013 - private static final int NUM_SHORT_VALUES = 1 << 16;
1.1014 -
1.1015 - /**
1.1016 - * Sorts the specified range of the array.
1.1017 - *
1.1018 - * @param a the array to be sorted
1.1019 - * @param left the index of the first element, inclusive, to be sorted
1.1020 - * @param right the index of the last element, inclusive, to be sorted
1.1021 - */
1.1022 - private static void doSort(short[] a, int left, int right) {
1.1023 - // Use Quicksort on small arrays
1.1024 - if (right - left < QUICKSORT_THRESHOLD) {
1.1025 - sort(a, left, right, true);
1.1026 - return;
1.1027 - }
1.1028 -
1.1029 - /*
1.1030 - * Index run[i] is the start of i-th run
1.1031 - * (ascending or descending sequence).
1.1032 - */
1.1033 - int[] run = new int[MAX_RUN_COUNT + 1];
1.1034 - int count = 0; run[0] = left;
1.1035 -
1.1036 - // Check if the array is nearly sorted
1.1037 - for (int k = left; k < right; run[count] = k) {
1.1038 - if (a[k] < a[k + 1]) { // ascending
1.1039 - while (++k <= right && a[k - 1] <= a[k]);
1.1040 - } else if (a[k] > a[k + 1]) { // descending
1.1041 - while (++k <= right && a[k - 1] >= a[k]);
1.1042 - for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
1.1043 - short t = a[lo]; a[lo] = a[hi]; a[hi] = t;
1.1044 - }
1.1045 - } else { // equal
1.1046 - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
1.1047 - if (--m == 0) {
1.1048 - sort(a, left, right, true);
1.1049 - return;
1.1050 - }
1.1051 - }
1.1052 - }
1.1053 -
1.1054 - /*
1.1055 - * The array is not highly structured,
1.1056 - * use Quicksort instead of merge sort.
1.1057 - */
1.1058 - if (++count == MAX_RUN_COUNT) {
1.1059 - sort(a, left, right, true);
1.1060 - return;
1.1061 - }
1.1062 - }
1.1063 -
1.1064 - // Check special cases
1.1065 - if (run[count] == right++) { // The last run contains one element
1.1066 - run[++count] = right;
1.1067 - } else if (count == 1) { // The array is already sorted
1.1068 - return;
1.1069 - }
1.1070 -
1.1071 - /*
1.1072 - * Create temporary array, which is used for merging.
1.1073 - * Implementation note: variable "right" is increased by 1.
1.1074 - */
1.1075 - short[] b; byte odd = 0;
1.1076 - for (int n = 1; (n <<= 1) < count; odd ^= 1);
1.1077 -
1.1078 - if (odd == 0) {
1.1079 - b = a; a = new short[b.length];
1.1080 - for (int i = left - 1; ++i < right; a[i] = b[i]);
1.1081 - } else {
1.1082 - b = new short[a.length];
1.1083 - }
1.1084 -
1.1085 - // Merging
1.1086 - for (int last; count > 1; count = last) {
1.1087 - for (int k = (last = 0) + 2; k <= count; k += 2) {
1.1088 - int hi = run[k], mi = run[k - 1];
1.1089 - for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
1.1090 - if (q >= hi || p < mi && a[p] <= a[q]) {
1.1091 - b[i] = a[p++];
1.1092 - } else {
1.1093 - b[i] = a[q++];
1.1094 - }
1.1095 - }
1.1096 - run[++last] = hi;
1.1097 - }
1.1098 - if ((count & 1) != 0) {
1.1099 - for (int i = right, lo = run[count - 1]; --i >= lo;
1.1100 - b[i] = a[i]
1.1101 - );
1.1102 - run[++last] = right;
1.1103 - }
1.1104 - short[] t = a; a = b; b = t;
1.1105 - }
1.1106 - }
1.1107 -
1.1108 - /**
1.1109 - * Sorts the specified range of the array by Dual-Pivot Quicksort.
1.1110 - *
1.1111 - * @param a the array to be sorted
1.1112 - * @param left the index of the first element, inclusive, to be sorted
1.1113 - * @param right the index of the last element, inclusive, to be sorted
1.1114 - * @param leftmost indicates if this part is the leftmost in the range
1.1115 - */
1.1116 - private static void sort(short[] a, int left, int right, boolean leftmost) {
1.1117 - int length = right - left + 1;
1.1118 -
1.1119 - // Use insertion sort on tiny arrays
1.1120 - if (length < INSERTION_SORT_THRESHOLD) {
1.1121 - if (leftmost) {
1.1122 - /*
1.1123 - * Traditional (without sentinel) insertion sort,
1.1124 - * optimized for server VM, is used in case of
1.1125 - * the leftmost part.
1.1126 - */
1.1127 - for (int i = left, j = i; i < right; j = ++i) {
1.1128 - short ai = a[i + 1];
1.1129 - while (ai < a[j]) {
1.1130 - a[j + 1] = a[j];
1.1131 - if (j-- == left) {
1.1132 - break;
1.1133 - }
1.1134 - }
1.1135 - a[j + 1] = ai;
1.1136 - }
1.1137 - } else {
1.1138 - /*
1.1139 - * Skip the longest ascending sequence.
1.1140 - */
1.1141 - do {
1.1142 - if (left >= right) {
1.1143 - return;
1.1144 - }
1.1145 - } while (a[++left] >= a[left - 1]);
1.1146 -
1.1147 - /*
1.1148 - * Every element from adjoining part plays the role
1.1149 - * of sentinel, therefore this allows us to avoid the
1.1150 - * left range check on each iteration. Moreover, we use
1.1151 - * the more optimized algorithm, so called pair insertion
1.1152 - * sort, which is faster (in the context of Quicksort)
1.1153 - * than traditional implementation of insertion sort.
1.1154 - */
1.1155 - for (int k = left; ++left <= right; k = ++left) {
1.1156 - short a1 = a[k], a2 = a[left];
1.1157 -
1.1158 - if (a1 < a2) {
1.1159 - a2 = a1; a1 = a[left];
1.1160 - }
1.1161 - while (a1 < a[--k]) {
1.1162 - a[k + 2] = a[k];
1.1163 - }
1.1164 - a[++k + 1] = a1;
1.1165 -
1.1166 - while (a2 < a[--k]) {
1.1167 - a[k + 1] = a[k];
1.1168 - }
1.1169 - a[k + 1] = a2;
1.1170 - }
1.1171 - short last = a[right];
1.1172 -
1.1173 - while (last < a[--right]) {
1.1174 - a[right + 1] = a[right];
1.1175 - }
1.1176 - a[right + 1] = last;
1.1177 - }
1.1178 - return;
1.1179 - }
1.1180 -
1.1181 - // Inexpensive approximation of length / 7
1.1182 - int seventh = (length >> 3) + (length >> 6) + 1;
1.1183 -
1.1184 - /*
1.1185 - * Sort five evenly spaced elements around (and including) the
1.1186 - * center element in the range. These elements will be used for
1.1187 - * pivot selection as described below. The choice for spacing
1.1188 - * these elements was empirically determined to work well on
1.1189 - * a wide variety of inputs.
1.1190 - */
1.1191 - int e3 = (left + right) >>> 1; // The midpoint
1.1192 - int e2 = e3 - seventh;
1.1193 - int e1 = e2 - seventh;
1.1194 - int e4 = e3 + seventh;
1.1195 - int e5 = e4 + seventh;
1.1196 -
1.1197 - // Sort these elements using insertion sort
1.1198 - if (a[e2] < a[e1]) { short t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
1.1199 -
1.1200 - if (a[e3] < a[e2]) { short t = a[e3]; a[e3] = a[e2]; a[e2] = t;
1.1201 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.1202 - }
1.1203 - if (a[e4] < a[e3]) { short t = a[e4]; a[e4] = a[e3]; a[e3] = t;
1.1204 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.1205 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.1206 - }
1.1207 - }
1.1208 - if (a[e5] < a[e4]) { short t = a[e5]; a[e5] = a[e4]; a[e4] = t;
1.1209 - if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
1.1210 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.1211 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.1212 - }
1.1213 - }
1.1214 - }
1.1215 -
1.1216 - // Pointers
1.1217 - int less = left; // The index of the first element of center part
1.1218 - int great = right; // The index before the first element of right part
1.1219 -
1.1220 - if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
1.1221 - /*
1.1222 - * Use the second and fourth of the five sorted elements as pivots.
1.1223 - * These values are inexpensive approximations of the first and
1.1224 - * second terciles of the array. Note that pivot1 <= pivot2.
1.1225 - */
1.1226 - short pivot1 = a[e2];
1.1227 - short pivot2 = a[e4];
1.1228 -
1.1229 - /*
1.1230 - * The first and the last elements to be sorted are moved to the
1.1231 - * locations formerly occupied by the pivots. When partitioning
1.1232 - * is complete, the pivots are swapped back into their final
1.1233 - * positions, and excluded from subsequent sorting.
1.1234 - */
1.1235 - a[e2] = a[left];
1.1236 - a[e4] = a[right];
1.1237 -
1.1238 - /*
1.1239 - * Skip elements, which are less or greater than pivot values.
1.1240 - */
1.1241 - while (a[++less] < pivot1);
1.1242 - while (a[--great] > pivot2);
1.1243 -
1.1244 - /*
1.1245 - * Partitioning:
1.1246 - *
1.1247 - * left part center part right part
1.1248 - * +--------------------------------------------------------------+
1.1249 - * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
1.1250 - * +--------------------------------------------------------------+
1.1251 - * ^ ^ ^
1.1252 - * | | |
1.1253 - * less k great
1.1254 - *
1.1255 - * Invariants:
1.1256 - *
1.1257 - * all in (left, less) < pivot1
1.1258 - * pivot1 <= all in [less, k) <= pivot2
1.1259 - * all in (great, right) > pivot2
1.1260 - *
1.1261 - * Pointer k is the first index of ?-part.
1.1262 - */
1.1263 - outer:
1.1264 - for (int k = less - 1; ++k <= great; ) {
1.1265 - short ak = a[k];
1.1266 - if (ak < pivot1) { // Move a[k] to left part
1.1267 - a[k] = a[less];
1.1268 - /*
1.1269 - * Here and below we use "a[i] = b; i++;" instead
1.1270 - * of "a[i++] = b;" due to performance issue.
1.1271 - */
1.1272 - a[less] = ak;
1.1273 - ++less;
1.1274 - } else if (ak > pivot2) { // Move a[k] to right part
1.1275 - while (a[great] > pivot2) {
1.1276 - if (great-- == k) {
1.1277 - break outer;
1.1278 - }
1.1279 - }
1.1280 - if (a[great] < pivot1) { // a[great] <= pivot2
1.1281 - a[k] = a[less];
1.1282 - a[less] = a[great];
1.1283 - ++less;
1.1284 - } else { // pivot1 <= a[great] <= pivot2
1.1285 - a[k] = a[great];
1.1286 - }
1.1287 - /*
1.1288 - * Here and below we use "a[i] = b; i--;" instead
1.1289 - * of "a[i--] = b;" due to performance issue.
1.1290 - */
1.1291 - a[great] = ak;
1.1292 - --great;
1.1293 - }
1.1294 - }
1.1295 -
1.1296 - // Swap pivots into their final positions
1.1297 - a[left] = a[less - 1]; a[less - 1] = pivot1;
1.1298 - a[right] = a[great + 1]; a[great + 1] = pivot2;
1.1299 -
1.1300 - // Sort left and right parts recursively, excluding known pivots
1.1301 - sort(a, left, less - 2, leftmost);
1.1302 - sort(a, great + 2, right, false);
1.1303 -
1.1304 - /*
1.1305 - * If center part is too large (comprises > 4/7 of the array),
1.1306 - * swap internal pivot values to ends.
1.1307 - */
1.1308 - if (less < e1 && e5 < great) {
1.1309 - /*
1.1310 - * Skip elements, which are equal to pivot values.
1.1311 - */
1.1312 - while (a[less] == pivot1) {
1.1313 - ++less;
1.1314 - }
1.1315 -
1.1316 - while (a[great] == pivot2) {
1.1317 - --great;
1.1318 - }
1.1319 -
1.1320 - /*
1.1321 - * Partitioning:
1.1322 - *
1.1323 - * left part center part right part
1.1324 - * +----------------------------------------------------------+
1.1325 - * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
1.1326 - * +----------------------------------------------------------+
1.1327 - * ^ ^ ^
1.1328 - * | | |
1.1329 - * less k great
1.1330 - *
1.1331 - * Invariants:
1.1332 - *
1.1333 - * all in (*, less) == pivot1
1.1334 - * pivot1 < all in [less, k) < pivot2
1.1335 - * all in (great, *) == pivot2
1.1336 - *
1.1337 - * Pointer k is the first index of ?-part.
1.1338 - */
1.1339 - outer:
1.1340 - for (int k = less - 1; ++k <= great; ) {
1.1341 - short ak = a[k];
1.1342 - if (ak == pivot1) { // Move a[k] to left part
1.1343 - a[k] = a[less];
1.1344 - a[less] = ak;
1.1345 - ++less;
1.1346 - } else if (ak == pivot2) { // Move a[k] to right part
1.1347 - while (a[great] == pivot2) {
1.1348 - if (great-- == k) {
1.1349 - break outer;
1.1350 - }
1.1351 - }
1.1352 - if (a[great] == pivot1) { // a[great] < pivot2
1.1353 - a[k] = a[less];
1.1354 - /*
1.1355 - * Even though a[great] equals to pivot1, the
1.1356 - * assignment a[less] = pivot1 may be incorrect,
1.1357 - * if a[great] and pivot1 are floating-point zeros
1.1358 - * of different signs. Therefore in float and
1.1359 - * double sorting methods we have to use more
1.1360 - * accurate assignment a[less] = a[great].
1.1361 - */
1.1362 - a[less] = pivot1;
1.1363 - ++less;
1.1364 - } else { // pivot1 < a[great] < pivot2
1.1365 - a[k] = a[great];
1.1366 - }
1.1367 - a[great] = ak;
1.1368 - --great;
1.1369 - }
1.1370 - }
1.1371 - }
1.1372 -
1.1373 - // Sort center part recursively
1.1374 - sort(a, less, great, false);
1.1375 -
1.1376 - } else { // Partitioning with one pivot
1.1377 - /*
1.1378 - * Use the third of the five sorted elements as pivot.
1.1379 - * This value is inexpensive approximation of the median.
1.1380 - */
1.1381 - short pivot = a[e3];
1.1382 -
1.1383 - /*
1.1384 - * Partitioning degenerates to the traditional 3-way
1.1385 - * (or "Dutch National Flag") schema:
1.1386 - *
1.1387 - * left part center part right part
1.1388 - * +-------------------------------------------------+
1.1389 - * | < pivot | == pivot | ? | > pivot |
1.1390 - * +-------------------------------------------------+
1.1391 - * ^ ^ ^
1.1392 - * | | |
1.1393 - * less k great
1.1394 - *
1.1395 - * Invariants:
1.1396 - *
1.1397 - * all in (left, less) < pivot
1.1398 - * all in [less, k) == pivot
1.1399 - * all in (great, right) > pivot
1.1400 - *
1.1401 - * Pointer k is the first index of ?-part.
1.1402 - */
1.1403 - for (int k = less; k <= great; ++k) {
1.1404 - if (a[k] == pivot) {
1.1405 - continue;
1.1406 - }
1.1407 - short ak = a[k];
1.1408 - if (ak < pivot) { // Move a[k] to left part
1.1409 - a[k] = a[less];
1.1410 - a[less] = ak;
1.1411 - ++less;
1.1412 - } else { // a[k] > pivot - Move a[k] to right part
1.1413 - while (a[great] > pivot) {
1.1414 - --great;
1.1415 - }
1.1416 - if (a[great] < pivot) { // a[great] <= pivot
1.1417 - a[k] = a[less];
1.1418 - a[less] = a[great];
1.1419 - ++less;
1.1420 - } else { // a[great] == pivot
1.1421 - /*
1.1422 - * Even though a[great] equals to pivot, the
1.1423 - * assignment a[k] = pivot may be incorrect,
1.1424 - * if a[great] and pivot are floating-point
1.1425 - * zeros of different signs. Therefore in float
1.1426 - * and double sorting methods we have to use
1.1427 - * more accurate assignment a[k] = a[great].
1.1428 - */
1.1429 - a[k] = pivot;
1.1430 - }
1.1431 - a[great] = ak;
1.1432 - --great;
1.1433 - }
1.1434 - }
1.1435 -
1.1436 - /*
1.1437 - * Sort left and right parts recursively.
1.1438 - * All elements from center part are equal
1.1439 - * and, therefore, already sorted.
1.1440 - */
1.1441 - sort(a, left, less - 1, leftmost);
1.1442 - sort(a, great + 1, right, false);
1.1443 - }
1.1444 - }
1.1445 -
1.1446 - /**
1.1447 - * Sorts the specified array.
1.1448 - *
1.1449 - * @param a the array to be sorted
1.1450 - */
1.1451 - public static void sort(char[] a) {
1.1452 - sort(a, 0, a.length - 1);
1.1453 - }
1.1454 -
1.1455 - /**
1.1456 - * Sorts the specified range of the array.
1.1457 - *
1.1458 - * @param a the array to be sorted
1.1459 - * @param left the index of the first element, inclusive, to be sorted
1.1460 - * @param right the index of the last element, inclusive, to be sorted
1.1461 - */
1.1462 - public static void sort(char[] a, int left, int right) {
1.1463 - // Use counting sort on large arrays
1.1464 - if (right - left > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) {
1.1465 - int[] count = new int[NUM_CHAR_VALUES];
1.1466 -
1.1467 - for (int i = left - 1; ++i <= right;
1.1468 - count[a[i]]++
1.1469 - );
1.1470 - for (int i = NUM_CHAR_VALUES, k = right + 1; k > left; ) {
1.1471 - while (count[--i] == 0);
1.1472 - char value = (char) i;
1.1473 - int s = count[i];
1.1474 -
1.1475 - do {
1.1476 - a[--k] = value;
1.1477 - } while (--s > 0);
1.1478 - }
1.1479 - } else { // Use Dual-Pivot Quicksort on small arrays
1.1480 - doSort(a, left, right);
1.1481 - }
1.1482 - }
1.1483 -
1.1484 - /** The number of distinct char values. */
1.1485 - private static final int NUM_CHAR_VALUES = 1 << 16;
1.1486 -
1.1487 - /**
1.1488 - * Sorts the specified range of the array.
1.1489 - *
1.1490 - * @param a the array to be sorted
1.1491 - * @param left the index of the first element, inclusive, to be sorted
1.1492 - * @param right the index of the last element, inclusive, to be sorted
1.1493 - */
1.1494 - private static void doSort(char[] a, int left, int right) {
1.1495 - // Use Quicksort on small arrays
1.1496 - if (right - left < QUICKSORT_THRESHOLD) {
1.1497 - sort(a, left, right, true);
1.1498 - return;
1.1499 - }
1.1500 -
1.1501 - /*
1.1502 - * Index run[i] is the start of i-th run
1.1503 - * (ascending or descending sequence).
1.1504 - */
1.1505 - int[] run = new int[MAX_RUN_COUNT + 1];
1.1506 - int count = 0; run[0] = left;
1.1507 -
1.1508 - // Check if the array is nearly sorted
1.1509 - for (int k = left; k < right; run[count] = k) {
1.1510 - if (a[k] < a[k + 1]) { // ascending
1.1511 - while (++k <= right && a[k - 1] <= a[k]);
1.1512 - } else if (a[k] > a[k + 1]) { // descending
1.1513 - while (++k <= right && a[k - 1] >= a[k]);
1.1514 - for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
1.1515 - char t = a[lo]; a[lo] = a[hi]; a[hi] = t;
1.1516 - }
1.1517 - } else { // equal
1.1518 - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
1.1519 - if (--m == 0) {
1.1520 - sort(a, left, right, true);
1.1521 - return;
1.1522 - }
1.1523 - }
1.1524 - }
1.1525 -
1.1526 - /*
1.1527 - * The array is not highly structured,
1.1528 - * use Quicksort instead of merge sort.
1.1529 - */
1.1530 - if (++count == MAX_RUN_COUNT) {
1.1531 - sort(a, left, right, true);
1.1532 - return;
1.1533 - }
1.1534 - }
1.1535 -
1.1536 - // Check special cases
1.1537 - if (run[count] == right++) { // The last run contains one element
1.1538 - run[++count] = right;
1.1539 - } else if (count == 1) { // The array is already sorted
1.1540 - return;
1.1541 - }
1.1542 -
1.1543 - /*
1.1544 - * Create temporary array, which is used for merging.
1.1545 - * Implementation note: variable "right" is increased by 1.
1.1546 - */
1.1547 - char[] b; byte odd = 0;
1.1548 - for (int n = 1; (n <<= 1) < count; odd ^= 1);
1.1549 -
1.1550 - if (odd == 0) {
1.1551 - b = a; a = new char[b.length];
1.1552 - for (int i = left - 1; ++i < right; a[i] = b[i]);
1.1553 - } else {
1.1554 - b = new char[a.length];
1.1555 - }
1.1556 -
1.1557 - // Merging
1.1558 - for (int last; count > 1; count = last) {
1.1559 - for (int k = (last = 0) + 2; k <= count; k += 2) {
1.1560 - int hi = run[k], mi = run[k - 1];
1.1561 - for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
1.1562 - if (q >= hi || p < mi && a[p] <= a[q]) {
1.1563 - b[i] = a[p++];
1.1564 - } else {
1.1565 - b[i] = a[q++];
1.1566 - }
1.1567 - }
1.1568 - run[++last] = hi;
1.1569 - }
1.1570 - if ((count & 1) != 0) {
1.1571 - for (int i = right, lo = run[count - 1]; --i >= lo;
1.1572 - b[i] = a[i]
1.1573 - );
1.1574 - run[++last] = right;
1.1575 - }
1.1576 - char[] t = a; a = b; b = t;
1.1577 - }
1.1578 - }
1.1579 -
1.1580 - /**
1.1581 - * Sorts the specified range of the array by Dual-Pivot Quicksort.
1.1582 - *
1.1583 - * @param a the array to be sorted
1.1584 - * @param left the index of the first element, inclusive, to be sorted
1.1585 - * @param right the index of the last element, inclusive, to be sorted
1.1586 - * @param leftmost indicates if this part is the leftmost in the range
1.1587 - */
1.1588 - private static void sort(char[] a, int left, int right, boolean leftmost) {
1.1589 - int length = right - left + 1;
1.1590 -
1.1591 - // Use insertion sort on tiny arrays
1.1592 - if (length < INSERTION_SORT_THRESHOLD) {
1.1593 - if (leftmost) {
1.1594 - /*
1.1595 - * Traditional (without sentinel) insertion sort,
1.1596 - * optimized for server VM, is used in case of
1.1597 - * the leftmost part.
1.1598 - */
1.1599 - for (int i = left, j = i; i < right; j = ++i) {
1.1600 - char ai = a[i + 1];
1.1601 - while (ai < a[j]) {
1.1602 - a[j + 1] = a[j];
1.1603 - if (j-- == left) {
1.1604 - break;
1.1605 - }
1.1606 - }
1.1607 - a[j + 1] = ai;
1.1608 - }
1.1609 - } else {
1.1610 - /*
1.1611 - * Skip the longest ascending sequence.
1.1612 - */
1.1613 - do {
1.1614 - if (left >= right) {
1.1615 - return;
1.1616 - }
1.1617 - } while (a[++left] >= a[left - 1]);
1.1618 -
1.1619 - /*
1.1620 - * Every element from adjoining part plays the role
1.1621 - * of sentinel, therefore this allows us to avoid the
1.1622 - * left range check on each iteration. Moreover, we use
1.1623 - * the more optimized algorithm, so called pair insertion
1.1624 - * sort, which is faster (in the context of Quicksort)
1.1625 - * than traditional implementation of insertion sort.
1.1626 - */
1.1627 - for (int k = left; ++left <= right; k = ++left) {
1.1628 - char a1 = a[k], a2 = a[left];
1.1629 -
1.1630 - if (a1 < a2) {
1.1631 - a2 = a1; a1 = a[left];
1.1632 - }
1.1633 - while (a1 < a[--k]) {
1.1634 - a[k + 2] = a[k];
1.1635 - }
1.1636 - a[++k + 1] = a1;
1.1637 -
1.1638 - while (a2 < a[--k]) {
1.1639 - a[k + 1] = a[k];
1.1640 - }
1.1641 - a[k + 1] = a2;
1.1642 - }
1.1643 - char last = a[right];
1.1644 -
1.1645 - while (last < a[--right]) {
1.1646 - a[right + 1] = a[right];
1.1647 - }
1.1648 - a[right + 1] = last;
1.1649 - }
1.1650 - return;
1.1651 - }
1.1652 -
1.1653 - // Inexpensive approximation of length / 7
1.1654 - int seventh = (length >> 3) + (length >> 6) + 1;
1.1655 -
1.1656 - /*
1.1657 - * Sort five evenly spaced elements around (and including) the
1.1658 - * center element in the range. These elements will be used for
1.1659 - * pivot selection as described below. The choice for spacing
1.1660 - * these elements was empirically determined to work well on
1.1661 - * a wide variety of inputs.
1.1662 - */
1.1663 - int e3 = (left + right) >>> 1; // The midpoint
1.1664 - int e2 = e3 - seventh;
1.1665 - int e1 = e2 - seventh;
1.1666 - int e4 = e3 + seventh;
1.1667 - int e5 = e4 + seventh;
1.1668 -
1.1669 - // Sort these elements using insertion sort
1.1670 - if (a[e2] < a[e1]) { char t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
1.1671 -
1.1672 - if (a[e3] < a[e2]) { char t = a[e3]; a[e3] = a[e2]; a[e2] = t;
1.1673 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.1674 - }
1.1675 - if (a[e4] < a[e3]) { char t = a[e4]; a[e4] = a[e3]; a[e3] = t;
1.1676 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.1677 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.1678 - }
1.1679 - }
1.1680 - if (a[e5] < a[e4]) { char t = a[e5]; a[e5] = a[e4]; a[e4] = t;
1.1681 - if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
1.1682 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.1683 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.1684 - }
1.1685 - }
1.1686 - }
1.1687 -
1.1688 - // Pointers
1.1689 - int less = left; // The index of the first element of center part
1.1690 - int great = right; // The index before the first element of right part
1.1691 -
1.1692 - if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
1.1693 - /*
1.1694 - * Use the second and fourth of the five sorted elements as pivots.
1.1695 - * These values are inexpensive approximations of the first and
1.1696 - * second terciles of the array. Note that pivot1 <= pivot2.
1.1697 - */
1.1698 - char pivot1 = a[e2];
1.1699 - char pivot2 = a[e4];
1.1700 -
1.1701 - /*
1.1702 - * The first and the last elements to be sorted are moved to the
1.1703 - * locations formerly occupied by the pivots. When partitioning
1.1704 - * is complete, the pivots are swapped back into their final
1.1705 - * positions, and excluded from subsequent sorting.
1.1706 - */
1.1707 - a[e2] = a[left];
1.1708 - a[e4] = a[right];
1.1709 -
1.1710 - /*
1.1711 - * Skip elements, which are less or greater than pivot values.
1.1712 - */
1.1713 - while (a[++less] < pivot1);
1.1714 - while (a[--great] > pivot2);
1.1715 -
1.1716 - /*
1.1717 - * Partitioning:
1.1718 - *
1.1719 - * left part center part right part
1.1720 - * +--------------------------------------------------------------+
1.1721 - * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
1.1722 - * +--------------------------------------------------------------+
1.1723 - * ^ ^ ^
1.1724 - * | | |
1.1725 - * less k great
1.1726 - *
1.1727 - * Invariants:
1.1728 - *
1.1729 - * all in (left, less) < pivot1
1.1730 - * pivot1 <= all in [less, k) <= pivot2
1.1731 - * all in (great, right) > pivot2
1.1732 - *
1.1733 - * Pointer k is the first index of ?-part.
1.1734 - */
1.1735 - outer:
1.1736 - for (int k = less - 1; ++k <= great; ) {
1.1737 - char ak = a[k];
1.1738 - if (ak < pivot1) { // Move a[k] to left part
1.1739 - a[k] = a[less];
1.1740 - /*
1.1741 - * Here and below we use "a[i] = b; i++;" instead
1.1742 - * of "a[i++] = b;" due to performance issue.
1.1743 - */
1.1744 - a[less] = ak;
1.1745 - ++less;
1.1746 - } else if (ak > pivot2) { // Move a[k] to right part
1.1747 - while (a[great] > pivot2) {
1.1748 - if (great-- == k) {
1.1749 - break outer;
1.1750 - }
1.1751 - }
1.1752 - if (a[great] < pivot1) { // a[great] <= pivot2
1.1753 - a[k] = a[less];
1.1754 - a[less] = a[great];
1.1755 - ++less;
1.1756 - } else { // pivot1 <= a[great] <= pivot2
1.1757 - a[k] = a[great];
1.1758 - }
1.1759 - /*
1.1760 - * Here and below we use "a[i] = b; i--;" instead
1.1761 - * of "a[i--] = b;" due to performance issue.
1.1762 - */
1.1763 - a[great] = ak;
1.1764 - --great;
1.1765 - }
1.1766 - }
1.1767 -
1.1768 - // Swap pivots into their final positions
1.1769 - a[left] = a[less - 1]; a[less - 1] = pivot1;
1.1770 - a[right] = a[great + 1]; a[great + 1] = pivot2;
1.1771 -
1.1772 - // Sort left and right parts recursively, excluding known pivots
1.1773 - sort(a, left, less - 2, leftmost);
1.1774 - sort(a, great + 2, right, false);
1.1775 -
1.1776 - /*
1.1777 - * If center part is too large (comprises > 4/7 of the array),
1.1778 - * swap internal pivot values to ends.
1.1779 - */
1.1780 - if (less < e1 && e5 < great) {
1.1781 - /*
1.1782 - * Skip elements, which are equal to pivot values.
1.1783 - */
1.1784 - while (a[less] == pivot1) {
1.1785 - ++less;
1.1786 - }
1.1787 -
1.1788 - while (a[great] == pivot2) {
1.1789 - --great;
1.1790 - }
1.1791 -
1.1792 - /*
1.1793 - * Partitioning:
1.1794 - *
1.1795 - * left part center part right part
1.1796 - * +----------------------------------------------------------+
1.1797 - * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
1.1798 - * +----------------------------------------------------------+
1.1799 - * ^ ^ ^
1.1800 - * | | |
1.1801 - * less k great
1.1802 - *
1.1803 - * Invariants:
1.1804 - *
1.1805 - * all in (*, less) == pivot1
1.1806 - * pivot1 < all in [less, k) < pivot2
1.1807 - * all in (great, *) == pivot2
1.1808 - *
1.1809 - * Pointer k is the first index of ?-part.
1.1810 - */
1.1811 - outer:
1.1812 - for (int k = less - 1; ++k <= great; ) {
1.1813 - char ak = a[k];
1.1814 - if (ak == pivot1) { // Move a[k] to left part
1.1815 - a[k] = a[less];
1.1816 - a[less] = ak;
1.1817 - ++less;
1.1818 - } else if (ak == pivot2) { // Move a[k] to right part
1.1819 - while (a[great] == pivot2) {
1.1820 - if (great-- == k) {
1.1821 - break outer;
1.1822 - }
1.1823 - }
1.1824 - if (a[great] == pivot1) { // a[great] < pivot2
1.1825 - a[k] = a[less];
1.1826 - /*
1.1827 - * Even though a[great] equals to pivot1, the
1.1828 - * assignment a[less] = pivot1 may be incorrect,
1.1829 - * if a[great] and pivot1 are floating-point zeros
1.1830 - * of different signs. Therefore in float and
1.1831 - * double sorting methods we have to use more
1.1832 - * accurate assignment a[less] = a[great].
1.1833 - */
1.1834 - a[less] = pivot1;
1.1835 - ++less;
1.1836 - } else { // pivot1 < a[great] < pivot2
1.1837 - a[k] = a[great];
1.1838 - }
1.1839 - a[great] = ak;
1.1840 - --great;
1.1841 - }
1.1842 - }
1.1843 - }
1.1844 -
1.1845 - // Sort center part recursively
1.1846 - sort(a, less, great, false);
1.1847 -
1.1848 - } else { // Partitioning with one pivot
1.1849 - /*
1.1850 - * Use the third of the five sorted elements as pivot.
1.1851 - * This value is inexpensive approximation of the median.
1.1852 - */
1.1853 - char pivot = a[e3];
1.1854 -
1.1855 - /*
1.1856 - * Partitioning degenerates to the traditional 3-way
1.1857 - * (or "Dutch National Flag") schema:
1.1858 - *
1.1859 - * left part center part right part
1.1860 - * +-------------------------------------------------+
1.1861 - * | < pivot | == pivot | ? | > pivot |
1.1862 - * +-------------------------------------------------+
1.1863 - * ^ ^ ^
1.1864 - * | | |
1.1865 - * less k great
1.1866 - *
1.1867 - * Invariants:
1.1868 - *
1.1869 - * all in (left, less) < pivot
1.1870 - * all in [less, k) == pivot
1.1871 - * all in (great, right) > pivot
1.1872 - *
1.1873 - * Pointer k is the first index of ?-part.
1.1874 - */
1.1875 - for (int k = less; k <= great; ++k) {
1.1876 - if (a[k] == pivot) {
1.1877 - continue;
1.1878 - }
1.1879 - char ak = a[k];
1.1880 - if (ak < pivot) { // Move a[k] to left part
1.1881 - a[k] = a[less];
1.1882 - a[less] = ak;
1.1883 - ++less;
1.1884 - } else { // a[k] > pivot - Move a[k] to right part
1.1885 - while (a[great] > pivot) {
1.1886 - --great;
1.1887 - }
1.1888 - if (a[great] < pivot) { // a[great] <= pivot
1.1889 - a[k] = a[less];
1.1890 - a[less] = a[great];
1.1891 - ++less;
1.1892 - } else { // a[great] == pivot
1.1893 - /*
1.1894 - * Even though a[great] equals to pivot, the
1.1895 - * assignment a[k] = pivot may be incorrect,
1.1896 - * if a[great] and pivot are floating-point
1.1897 - * zeros of different signs. Therefore in float
1.1898 - * and double sorting methods we have to use
1.1899 - * more accurate assignment a[k] = a[great].
1.1900 - */
1.1901 - a[k] = pivot;
1.1902 - }
1.1903 - a[great] = ak;
1.1904 - --great;
1.1905 - }
1.1906 - }
1.1907 -
1.1908 - /*
1.1909 - * Sort left and right parts recursively.
1.1910 - * All elements from center part are equal
1.1911 - * and, therefore, already sorted.
1.1912 - */
1.1913 - sort(a, left, less - 1, leftmost);
1.1914 - sort(a, great + 1, right, false);
1.1915 - }
1.1916 - }
1.1917 -
1.1918 - /** The number of distinct byte values. */
1.1919 - private static final int NUM_BYTE_VALUES = 1 << 8;
1.1920 -
1.1921 - /**
1.1922 - * Sorts the specified array.
1.1923 - *
1.1924 - * @param a the array to be sorted
1.1925 - */
1.1926 - public static void sort(byte[] a) {
1.1927 - sort(a, 0, a.length - 1);
1.1928 - }
1.1929 -
1.1930 - /**
1.1931 - * Sorts the specified range of the array.
1.1932 - *
1.1933 - * @param a the array to be sorted
1.1934 - * @param left the index of the first element, inclusive, to be sorted
1.1935 - * @param right the index of the last element, inclusive, to be sorted
1.1936 - */
1.1937 - public static void sort(byte[] a, int left, int right) {
1.1938 - // Use counting sort on large arrays
1.1939 - if (right - left > COUNTING_SORT_THRESHOLD_FOR_BYTE) {
1.1940 - int[] count = new int[NUM_BYTE_VALUES];
1.1941 -
1.1942 - for (int i = left - 1; ++i <= right;
1.1943 - count[a[i] - Byte.MIN_VALUE]++
1.1944 - );
1.1945 - for (int i = NUM_BYTE_VALUES, k = right + 1; k > left; ) {
1.1946 - while (count[--i] == 0);
1.1947 - byte value = (byte) (i + Byte.MIN_VALUE);
1.1948 - int s = count[i];
1.1949 -
1.1950 - do {
1.1951 - a[--k] = value;
1.1952 - } while (--s > 0);
1.1953 - }
1.1954 - } else { // Use insertion sort on small arrays
1.1955 - for (int i = left, j = i; i < right; j = ++i) {
1.1956 - byte ai = a[i + 1];
1.1957 - while (ai < a[j]) {
1.1958 - a[j + 1] = a[j];
1.1959 - if (j-- == left) {
1.1960 - break;
1.1961 - }
1.1962 - }
1.1963 - a[j + 1] = ai;
1.1964 - }
1.1965 - }
1.1966 - }
1.1967 -
1.1968 - /**
1.1969 - * Sorts the specified array.
1.1970 - *
1.1971 - * @param a the array to be sorted
1.1972 - */
1.1973 - public static void sort(float[] a) {
1.1974 - sort(a, 0, a.length - 1);
1.1975 - }
1.1976 -
1.1977 - /**
1.1978 - * Sorts the specified range of the array.
1.1979 - *
1.1980 - * @param a the array to be sorted
1.1981 - * @param left the index of the first element, inclusive, to be sorted
1.1982 - * @param right the index of the last element, inclusive, to be sorted
1.1983 - */
1.1984 - public static void sort(float[] a, int left, int right) {
1.1985 - /*
1.1986 - * Phase 1: Move NaNs to the end of the array.
1.1987 - */
1.1988 - while (left <= right && Float.isNaN(a[right])) {
1.1989 - --right;
1.1990 - }
1.1991 - for (int k = right; --k >= left; ) {
1.1992 - float ak = a[k];
1.1993 - if (ak != ak) { // a[k] is NaN
1.1994 - a[k] = a[right];
1.1995 - a[right] = ak;
1.1996 - --right;
1.1997 - }
1.1998 - }
1.1999 -
1.2000 - /*
1.2001 - * Phase 2: Sort everything except NaNs (which are already in place).
1.2002 - */
1.2003 - doSort(a, left, right);
1.2004 -
1.2005 - /*
1.2006 - * Phase 3: Place negative zeros before positive zeros.
1.2007 - */
1.2008 - int hi = right;
1.2009 -
1.2010 - /*
1.2011 - * Find the first zero, or first positive, or last negative element.
1.2012 - */
1.2013 - while (left < hi) {
1.2014 - int middle = (left + hi) >>> 1;
1.2015 - float middleValue = a[middle];
1.2016 -
1.2017 - if (middleValue < 0.0f) {
1.2018 - left = middle + 1;
1.2019 - } else {
1.2020 - hi = middle;
1.2021 - }
1.2022 - }
1.2023 -
1.2024 - /*
1.2025 - * Skip the last negative value (if any) or all leading negative zeros.
1.2026 - */
1.2027 - while (left <= right && Float.floatToRawIntBits(a[left]) < 0) {
1.2028 - ++left;
1.2029 - }
1.2030 -
1.2031 - /*
1.2032 - * Move negative zeros to the beginning of the sub-range.
1.2033 - *
1.2034 - * Partitioning:
1.2035 - *
1.2036 - * +----------------------------------------------------+
1.2037 - * | < 0.0 | -0.0 | 0.0 | ? ( >= 0.0 ) |
1.2038 - * +----------------------------------------------------+
1.2039 - * ^ ^ ^
1.2040 - * | | |
1.2041 - * left p k
1.2042 - *
1.2043 - * Invariants:
1.2044 - *
1.2045 - * all in (*, left) < 0.0
1.2046 - * all in [left, p) == -0.0
1.2047 - * all in [p, k) == 0.0
1.2048 - * all in [k, right] >= 0.0
1.2049 - *
1.2050 - * Pointer k is the first index of ?-part.
1.2051 - */
1.2052 - for (int k = left, p = left - 1; ++k <= right; ) {
1.2053 - float ak = a[k];
1.2054 - if (ak != 0.0f) {
1.2055 - break;
1.2056 - }
1.2057 - if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f
1.2058 - a[k] = 0.0f;
1.2059 - a[++p] = -0.0f;
1.2060 - }
1.2061 - }
1.2062 - }
1.2063 -
1.2064 - /**
1.2065 - * Sorts the specified range of the array.
1.2066 - *
1.2067 - * @param a the array to be sorted
1.2068 - * @param left the index of the first element, inclusive, to be sorted
1.2069 - * @param right the index of the last element, inclusive, to be sorted
1.2070 - */
1.2071 - private static void doSort(float[] a, int left, int right) {
1.2072 - // Use Quicksort on small arrays
1.2073 - if (right - left < QUICKSORT_THRESHOLD) {
1.2074 - sort(a, left, right, true);
1.2075 - return;
1.2076 - }
1.2077 -
1.2078 - /*
1.2079 - * Index run[i] is the start of i-th run
1.2080 - * (ascending or descending sequence).
1.2081 - */
1.2082 - int[] run = new int[MAX_RUN_COUNT + 1];
1.2083 - int count = 0; run[0] = left;
1.2084 -
1.2085 - // Check if the array is nearly sorted
1.2086 - for (int k = left; k < right; run[count] = k) {
1.2087 - if (a[k] < a[k + 1]) { // ascending
1.2088 - while (++k <= right && a[k - 1] <= a[k]);
1.2089 - } else if (a[k] > a[k + 1]) { // descending
1.2090 - while (++k <= right && a[k - 1] >= a[k]);
1.2091 - for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
1.2092 - float t = a[lo]; a[lo] = a[hi]; a[hi] = t;
1.2093 - }
1.2094 - } else { // equal
1.2095 - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
1.2096 - if (--m == 0) {
1.2097 - sort(a, left, right, true);
1.2098 - return;
1.2099 - }
1.2100 - }
1.2101 - }
1.2102 -
1.2103 - /*
1.2104 - * The array is not highly structured,
1.2105 - * use Quicksort instead of merge sort.
1.2106 - */
1.2107 - if (++count == MAX_RUN_COUNT) {
1.2108 - sort(a, left, right, true);
1.2109 - return;
1.2110 - }
1.2111 - }
1.2112 -
1.2113 - // Check special cases
1.2114 - if (run[count] == right++) { // The last run contains one element
1.2115 - run[++count] = right;
1.2116 - } else if (count == 1) { // The array is already sorted
1.2117 - return;
1.2118 - }
1.2119 -
1.2120 - /*
1.2121 - * Create temporary array, which is used for merging.
1.2122 - * Implementation note: variable "right" is increased by 1.
1.2123 - */
1.2124 - float[] b; byte odd = 0;
1.2125 - for (int n = 1; (n <<= 1) < count; odd ^= 1);
1.2126 -
1.2127 - if (odd == 0) {
1.2128 - b = a; a = new float[b.length];
1.2129 - for (int i = left - 1; ++i < right; a[i] = b[i]);
1.2130 - } else {
1.2131 - b = new float[a.length];
1.2132 - }
1.2133 -
1.2134 - // Merging
1.2135 - for (int last; count > 1; count = last) {
1.2136 - for (int k = (last = 0) + 2; k <= count; k += 2) {
1.2137 - int hi = run[k], mi = run[k - 1];
1.2138 - for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
1.2139 - if (q >= hi || p < mi && a[p] <= a[q]) {
1.2140 - b[i] = a[p++];
1.2141 - } else {
1.2142 - b[i] = a[q++];
1.2143 - }
1.2144 - }
1.2145 - run[++last] = hi;
1.2146 - }
1.2147 - if ((count & 1) != 0) {
1.2148 - for (int i = right, lo = run[count - 1]; --i >= lo;
1.2149 - b[i] = a[i]
1.2150 - );
1.2151 - run[++last] = right;
1.2152 - }
1.2153 - float[] t = a; a = b; b = t;
1.2154 - }
1.2155 - }
1.2156 -
1.2157 - /**
1.2158 - * Sorts the specified range of the array by Dual-Pivot Quicksort.
1.2159 - *
1.2160 - * @param a the array to be sorted
1.2161 - * @param left the index of the first element, inclusive, to be sorted
1.2162 - * @param right the index of the last element, inclusive, to be sorted
1.2163 - * @param leftmost indicates if this part is the leftmost in the range
1.2164 - */
1.2165 - private static void sort(float[] a, int left, int right, boolean leftmost) {
1.2166 - int length = right - left + 1;
1.2167 -
1.2168 - // Use insertion sort on tiny arrays
1.2169 - if (length < INSERTION_SORT_THRESHOLD) {
1.2170 - if (leftmost) {
1.2171 - /*
1.2172 - * Traditional (without sentinel) insertion sort,
1.2173 - * optimized for server VM, is used in case of
1.2174 - * the leftmost part.
1.2175 - */
1.2176 - for (int i = left, j = i; i < right; j = ++i) {
1.2177 - float ai = a[i + 1];
1.2178 - while (ai < a[j]) {
1.2179 - a[j + 1] = a[j];
1.2180 - if (j-- == left) {
1.2181 - break;
1.2182 - }
1.2183 - }
1.2184 - a[j + 1] = ai;
1.2185 - }
1.2186 - } else {
1.2187 - /*
1.2188 - * Skip the longest ascending sequence.
1.2189 - */
1.2190 - do {
1.2191 - if (left >= right) {
1.2192 - return;
1.2193 - }
1.2194 - } while (a[++left] >= a[left - 1]);
1.2195 -
1.2196 - /*
1.2197 - * Every element from adjoining part plays the role
1.2198 - * of sentinel, therefore this allows us to avoid the
1.2199 - * left range check on each iteration. Moreover, we use
1.2200 - * the more optimized algorithm, so called pair insertion
1.2201 - * sort, which is faster (in the context of Quicksort)
1.2202 - * than traditional implementation of insertion sort.
1.2203 - */
1.2204 - for (int k = left; ++left <= right; k = ++left) {
1.2205 - float a1 = a[k], a2 = a[left];
1.2206 -
1.2207 - if (a1 < a2) {
1.2208 - a2 = a1; a1 = a[left];
1.2209 - }
1.2210 - while (a1 < a[--k]) {
1.2211 - a[k + 2] = a[k];
1.2212 - }
1.2213 - a[++k + 1] = a1;
1.2214 -
1.2215 - while (a2 < a[--k]) {
1.2216 - a[k + 1] = a[k];
1.2217 - }
1.2218 - a[k + 1] = a2;
1.2219 - }
1.2220 - float last = a[right];
1.2221 -
1.2222 - while (last < a[--right]) {
1.2223 - a[right + 1] = a[right];
1.2224 - }
1.2225 - a[right + 1] = last;
1.2226 - }
1.2227 - return;
1.2228 - }
1.2229 -
1.2230 - // Inexpensive approximation of length / 7
1.2231 - int seventh = (length >> 3) + (length >> 6) + 1;
1.2232 -
1.2233 - /*
1.2234 - * Sort five evenly spaced elements around (and including) the
1.2235 - * center element in the range. These elements will be used for
1.2236 - * pivot selection as described below. The choice for spacing
1.2237 - * these elements was empirically determined to work well on
1.2238 - * a wide variety of inputs.
1.2239 - */
1.2240 - int e3 = (left + right) >>> 1; // The midpoint
1.2241 - int e2 = e3 - seventh;
1.2242 - int e1 = e2 - seventh;
1.2243 - int e4 = e3 + seventh;
1.2244 - int e5 = e4 + seventh;
1.2245 -
1.2246 - // Sort these elements using insertion sort
1.2247 - if (a[e2] < a[e1]) { float t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
1.2248 -
1.2249 - if (a[e3] < a[e2]) { float t = a[e3]; a[e3] = a[e2]; a[e2] = t;
1.2250 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.2251 - }
1.2252 - if (a[e4] < a[e3]) { float t = a[e4]; a[e4] = a[e3]; a[e3] = t;
1.2253 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.2254 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.2255 - }
1.2256 - }
1.2257 - if (a[e5] < a[e4]) { float t = a[e5]; a[e5] = a[e4]; a[e4] = t;
1.2258 - if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
1.2259 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.2260 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.2261 - }
1.2262 - }
1.2263 - }
1.2264 -
1.2265 - // Pointers
1.2266 - int less = left; // The index of the first element of center part
1.2267 - int great = right; // The index before the first element of right part
1.2268 -
1.2269 - if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
1.2270 - /*
1.2271 - * Use the second and fourth of the five sorted elements as pivots.
1.2272 - * These values are inexpensive approximations of the first and
1.2273 - * second terciles of the array. Note that pivot1 <= pivot2.
1.2274 - */
1.2275 - float pivot1 = a[e2];
1.2276 - float pivot2 = a[e4];
1.2277 -
1.2278 - /*
1.2279 - * The first and the last elements to be sorted are moved to the
1.2280 - * locations formerly occupied by the pivots. When partitioning
1.2281 - * is complete, the pivots are swapped back into their final
1.2282 - * positions, and excluded from subsequent sorting.
1.2283 - */
1.2284 - a[e2] = a[left];
1.2285 - a[e4] = a[right];
1.2286 -
1.2287 - /*
1.2288 - * Skip elements, which are less or greater than pivot values.
1.2289 - */
1.2290 - while (a[++less] < pivot1);
1.2291 - while (a[--great] > pivot2);
1.2292 -
1.2293 - /*
1.2294 - * Partitioning:
1.2295 - *
1.2296 - * left part center part right part
1.2297 - * +--------------------------------------------------------------+
1.2298 - * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
1.2299 - * +--------------------------------------------------------------+
1.2300 - * ^ ^ ^
1.2301 - * | | |
1.2302 - * less k great
1.2303 - *
1.2304 - * Invariants:
1.2305 - *
1.2306 - * all in (left, less) < pivot1
1.2307 - * pivot1 <= all in [less, k) <= pivot2
1.2308 - * all in (great, right) > pivot2
1.2309 - *
1.2310 - * Pointer k is the first index of ?-part.
1.2311 - */
1.2312 - outer:
1.2313 - for (int k = less - 1; ++k <= great; ) {
1.2314 - float ak = a[k];
1.2315 - if (ak < pivot1) { // Move a[k] to left part
1.2316 - a[k] = a[less];
1.2317 - /*
1.2318 - * Here and below we use "a[i] = b; i++;" instead
1.2319 - * of "a[i++] = b;" due to performance issue.
1.2320 - */
1.2321 - a[less] = ak;
1.2322 - ++less;
1.2323 - } else if (ak > pivot2) { // Move a[k] to right part
1.2324 - while (a[great] > pivot2) {
1.2325 - if (great-- == k) {
1.2326 - break outer;
1.2327 - }
1.2328 - }
1.2329 - if (a[great] < pivot1) { // a[great] <= pivot2
1.2330 - a[k] = a[less];
1.2331 - a[less] = a[great];
1.2332 - ++less;
1.2333 - } else { // pivot1 <= a[great] <= pivot2
1.2334 - a[k] = a[great];
1.2335 - }
1.2336 - /*
1.2337 - * Here and below we use "a[i] = b; i--;" instead
1.2338 - * of "a[i--] = b;" due to performance issue.
1.2339 - */
1.2340 - a[great] = ak;
1.2341 - --great;
1.2342 - }
1.2343 - }
1.2344 -
1.2345 - // Swap pivots into their final positions
1.2346 - a[left] = a[less - 1]; a[less - 1] = pivot1;
1.2347 - a[right] = a[great + 1]; a[great + 1] = pivot2;
1.2348 -
1.2349 - // Sort left and right parts recursively, excluding known pivots
1.2350 - sort(a, left, less - 2, leftmost);
1.2351 - sort(a, great + 2, right, false);
1.2352 -
1.2353 - /*
1.2354 - * If center part is too large (comprises > 4/7 of the array),
1.2355 - * swap internal pivot values to ends.
1.2356 - */
1.2357 - if (less < e1 && e5 < great) {
1.2358 - /*
1.2359 - * Skip elements, which are equal to pivot values.
1.2360 - */
1.2361 - while (a[less] == pivot1) {
1.2362 - ++less;
1.2363 - }
1.2364 -
1.2365 - while (a[great] == pivot2) {
1.2366 - --great;
1.2367 - }
1.2368 -
1.2369 - /*
1.2370 - * Partitioning:
1.2371 - *
1.2372 - * left part center part right part
1.2373 - * +----------------------------------------------------------+
1.2374 - * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
1.2375 - * +----------------------------------------------------------+
1.2376 - * ^ ^ ^
1.2377 - * | | |
1.2378 - * less k great
1.2379 - *
1.2380 - * Invariants:
1.2381 - *
1.2382 - * all in (*, less) == pivot1
1.2383 - * pivot1 < all in [less, k) < pivot2
1.2384 - * all in (great, *) == pivot2
1.2385 - *
1.2386 - * Pointer k is the first index of ?-part.
1.2387 - */
1.2388 - outer:
1.2389 - for (int k = less - 1; ++k <= great; ) {
1.2390 - float ak = a[k];
1.2391 - if (ak == pivot1) { // Move a[k] to left part
1.2392 - a[k] = a[less];
1.2393 - a[less] = ak;
1.2394 - ++less;
1.2395 - } else if (ak == pivot2) { // Move a[k] to right part
1.2396 - while (a[great] == pivot2) {
1.2397 - if (great-- == k) {
1.2398 - break outer;
1.2399 - }
1.2400 - }
1.2401 - if (a[great] == pivot1) { // a[great] < pivot2
1.2402 - a[k] = a[less];
1.2403 - /*
1.2404 - * Even though a[great] equals to pivot1, the
1.2405 - * assignment a[less] = pivot1 may be incorrect,
1.2406 - * if a[great] and pivot1 are floating-point zeros
1.2407 - * of different signs. Therefore in float and
1.2408 - * double sorting methods we have to use more
1.2409 - * accurate assignment a[less] = a[great].
1.2410 - */
1.2411 - a[less] = a[great];
1.2412 - ++less;
1.2413 - } else { // pivot1 < a[great] < pivot2
1.2414 - a[k] = a[great];
1.2415 - }
1.2416 - a[great] = ak;
1.2417 - --great;
1.2418 - }
1.2419 - }
1.2420 - }
1.2421 -
1.2422 - // Sort center part recursively
1.2423 - sort(a, less, great, false);
1.2424 -
1.2425 - } else { // Partitioning with one pivot
1.2426 - /*
1.2427 - * Use the third of the five sorted elements as pivot.
1.2428 - * This value is inexpensive approximation of the median.
1.2429 - */
1.2430 - float pivot = a[e3];
1.2431 -
1.2432 - /*
1.2433 - * Partitioning degenerates to the traditional 3-way
1.2434 - * (or "Dutch National Flag") schema:
1.2435 - *
1.2436 - * left part center part right part
1.2437 - * +-------------------------------------------------+
1.2438 - * | < pivot | == pivot | ? | > pivot |
1.2439 - * +-------------------------------------------------+
1.2440 - * ^ ^ ^
1.2441 - * | | |
1.2442 - * less k great
1.2443 - *
1.2444 - * Invariants:
1.2445 - *
1.2446 - * all in (left, less) < pivot
1.2447 - * all in [less, k) == pivot
1.2448 - * all in (great, right) > pivot
1.2449 - *
1.2450 - * Pointer k is the first index of ?-part.
1.2451 - */
1.2452 - for (int k = less; k <= great; ++k) {
1.2453 - if (a[k] == pivot) {
1.2454 - continue;
1.2455 - }
1.2456 - float ak = a[k];
1.2457 - if (ak < pivot) { // Move a[k] to left part
1.2458 - a[k] = a[less];
1.2459 - a[less] = ak;
1.2460 - ++less;
1.2461 - } else { // a[k] > pivot - Move a[k] to right part
1.2462 - while (a[great] > pivot) {
1.2463 - --great;
1.2464 - }
1.2465 - if (a[great] < pivot) { // a[great] <= pivot
1.2466 - a[k] = a[less];
1.2467 - a[less] = a[great];
1.2468 - ++less;
1.2469 - } else { // a[great] == pivot
1.2470 - /*
1.2471 - * Even though a[great] equals to pivot, the
1.2472 - * assignment a[k] = pivot may be incorrect,
1.2473 - * if a[great] and pivot are floating-point
1.2474 - * zeros of different signs. Therefore in float
1.2475 - * and double sorting methods we have to use
1.2476 - * more accurate assignment a[k] = a[great].
1.2477 - */
1.2478 - a[k] = a[great];
1.2479 - }
1.2480 - a[great] = ak;
1.2481 - --great;
1.2482 - }
1.2483 - }
1.2484 -
1.2485 - /*
1.2486 - * Sort left and right parts recursively.
1.2487 - * All elements from center part are equal
1.2488 - * and, therefore, already sorted.
1.2489 - */
1.2490 - sort(a, left, less - 1, leftmost);
1.2491 - sort(a, great + 1, right, false);
1.2492 - }
1.2493 - }
1.2494 -
1.2495 - /**
1.2496 - * Sorts the specified array.
1.2497 - *
1.2498 - * @param a the array to be sorted
1.2499 - */
1.2500 - public static void sort(double[] a) {
1.2501 - sort(a, 0, a.length - 1);
1.2502 - }
1.2503 -
1.2504 - /**
1.2505 - * Sorts the specified range of the array.
1.2506 - *
1.2507 - * @param a the array to be sorted
1.2508 - * @param left the index of the first element, inclusive, to be sorted
1.2509 - * @param right the index of the last element, inclusive, to be sorted
1.2510 - */
1.2511 - public static void sort(double[] a, int left, int right) {
1.2512 - /*
1.2513 - * Phase 1: Move NaNs to the end of the array.
1.2514 - */
1.2515 - while (left <= right && Double.isNaN(a[right])) {
1.2516 - --right;
1.2517 - }
1.2518 - for (int k = right; --k >= left; ) {
1.2519 - double ak = a[k];
1.2520 - if (ak != ak) { // a[k] is NaN
1.2521 - a[k] = a[right];
1.2522 - a[right] = ak;
1.2523 - --right;
1.2524 - }
1.2525 - }
1.2526 -
1.2527 - /*
1.2528 - * Phase 2: Sort everything except NaNs (which are already in place).
1.2529 - */
1.2530 - doSort(a, left, right);
1.2531 -
1.2532 - /*
1.2533 - * Phase 3: Place negative zeros before positive zeros.
1.2534 - */
1.2535 - int hi = right;
1.2536 -
1.2537 - /*
1.2538 - * Find the first zero, or first positive, or last negative element.
1.2539 - */
1.2540 - while (left < hi) {
1.2541 - int middle = (left + hi) >>> 1;
1.2542 - double middleValue = a[middle];
1.2543 -
1.2544 - if (middleValue < 0.0d) {
1.2545 - left = middle + 1;
1.2546 - } else {
1.2547 - hi = middle;
1.2548 - }
1.2549 - }
1.2550 -
1.2551 - /*
1.2552 - * Skip the last negative value (if any) or all leading negative zeros.
1.2553 - */
1.2554 - while (left <= right && Double.doubleToRawLongBits(a[left]) < 0) {
1.2555 - ++left;
1.2556 - }
1.2557 -
1.2558 - /*
1.2559 - * Move negative zeros to the beginning of the sub-range.
1.2560 - *
1.2561 - * Partitioning:
1.2562 - *
1.2563 - * +----------------------------------------------------+
1.2564 - * | < 0.0 | -0.0 | 0.0 | ? ( >= 0.0 ) |
1.2565 - * +----------------------------------------------------+
1.2566 - * ^ ^ ^
1.2567 - * | | |
1.2568 - * left p k
1.2569 - *
1.2570 - * Invariants:
1.2571 - *
1.2572 - * all in (*, left) < 0.0
1.2573 - * all in [left, p) == -0.0
1.2574 - * all in [p, k) == 0.0
1.2575 - * all in [k, right] >= 0.0
1.2576 - *
1.2577 - * Pointer k is the first index of ?-part.
1.2578 - */
1.2579 - for (int k = left, p = left - 1; ++k <= right; ) {
1.2580 - double ak = a[k];
1.2581 - if (ak != 0.0d) {
1.2582 - break;
1.2583 - }
1.2584 - if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d
1.2585 - a[k] = 0.0d;
1.2586 - a[++p] = -0.0d;
1.2587 - }
1.2588 - }
1.2589 - }
1.2590 -
1.2591 - /**
1.2592 - * Sorts the specified range of the array.
1.2593 - *
1.2594 - * @param a the array to be sorted
1.2595 - * @param left the index of the first element, inclusive, to be sorted
1.2596 - * @param right the index of the last element, inclusive, to be sorted
1.2597 - */
1.2598 - private static void doSort(double[] a, int left, int right) {
1.2599 - // Use Quicksort on small arrays
1.2600 - if (right - left < QUICKSORT_THRESHOLD) {
1.2601 - sort(a, left, right, true);
1.2602 - return;
1.2603 - }
1.2604 -
1.2605 - /*
1.2606 - * Index run[i] is the start of i-th run
1.2607 - * (ascending or descending sequence).
1.2608 - */
1.2609 - int[] run = new int[MAX_RUN_COUNT + 1];
1.2610 - int count = 0; run[0] = left;
1.2611 -
1.2612 - // Check if the array is nearly sorted
1.2613 - for (int k = left; k < right; run[count] = k) {
1.2614 - if (a[k] < a[k + 1]) { // ascending
1.2615 - while (++k <= right && a[k - 1] <= a[k]);
1.2616 - } else if (a[k] > a[k + 1]) { // descending
1.2617 - while (++k <= right && a[k - 1] >= a[k]);
1.2618 - for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
1.2619 - double t = a[lo]; a[lo] = a[hi]; a[hi] = t;
1.2620 - }
1.2621 - } else { // equal
1.2622 - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
1.2623 - if (--m == 0) {
1.2624 - sort(a, left, right, true);
1.2625 - return;
1.2626 - }
1.2627 - }
1.2628 - }
1.2629 -
1.2630 - /*
1.2631 - * The array is not highly structured,
1.2632 - * use Quicksort instead of merge sort.
1.2633 - */
1.2634 - if (++count == MAX_RUN_COUNT) {
1.2635 - sort(a, left, right, true);
1.2636 - return;
1.2637 - }
1.2638 - }
1.2639 -
1.2640 - // Check special cases
1.2641 - if (run[count] == right++) { // The last run contains one element
1.2642 - run[++count] = right;
1.2643 - } else if (count == 1) { // The array is already sorted
1.2644 - return;
1.2645 - }
1.2646 -
1.2647 - /*
1.2648 - * Create temporary array, which is used for merging.
1.2649 - * Implementation note: variable "right" is increased by 1.
1.2650 - */
1.2651 - double[] b; byte odd = 0;
1.2652 - for (int n = 1; (n <<= 1) < count; odd ^= 1);
1.2653 -
1.2654 - if (odd == 0) {
1.2655 - b = a; a = new double[b.length];
1.2656 - for (int i = left - 1; ++i < right; a[i] = b[i]);
1.2657 - } else {
1.2658 - b = new double[a.length];
1.2659 - }
1.2660 -
1.2661 - // Merging
1.2662 - for (int last; count > 1; count = last) {
1.2663 - for (int k = (last = 0) + 2; k <= count; k += 2) {
1.2664 - int hi = run[k], mi = run[k - 1];
1.2665 - for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
1.2666 - if (q >= hi || p < mi && a[p] <= a[q]) {
1.2667 - b[i] = a[p++];
1.2668 - } else {
1.2669 - b[i] = a[q++];
1.2670 - }
1.2671 - }
1.2672 - run[++last] = hi;
1.2673 - }
1.2674 - if ((count & 1) != 0) {
1.2675 - for (int i = right, lo = run[count - 1]; --i >= lo;
1.2676 - b[i] = a[i]
1.2677 - );
1.2678 - run[++last] = right;
1.2679 - }
1.2680 - double[] t = a; a = b; b = t;
1.2681 - }
1.2682 - }
1.2683 -
1.2684 - /**
1.2685 - * Sorts the specified range of the array by Dual-Pivot Quicksort.
1.2686 - *
1.2687 - * @param a the array to be sorted
1.2688 - * @param left the index of the first element, inclusive, to be sorted
1.2689 - * @param right the index of the last element, inclusive, to be sorted
1.2690 - * @param leftmost indicates if this part is the leftmost in the range
1.2691 - */
1.2692 - private static void sort(double[] a, int left, int right, boolean leftmost) {
1.2693 - int length = right - left + 1;
1.2694 -
1.2695 - // Use insertion sort on tiny arrays
1.2696 - if (length < INSERTION_SORT_THRESHOLD) {
1.2697 - if (leftmost) {
1.2698 - /*
1.2699 - * Traditional (without sentinel) insertion sort,
1.2700 - * optimized for server VM, is used in case of
1.2701 - * the leftmost part.
1.2702 - */
1.2703 - for (int i = left, j = i; i < right; j = ++i) {
1.2704 - double ai = a[i + 1];
1.2705 - while (ai < a[j]) {
1.2706 - a[j + 1] = a[j];
1.2707 - if (j-- == left) {
1.2708 - break;
1.2709 - }
1.2710 - }
1.2711 - a[j + 1] = ai;
1.2712 - }
1.2713 - } else {
1.2714 - /*
1.2715 - * Skip the longest ascending sequence.
1.2716 - */
1.2717 - do {
1.2718 - if (left >= right) {
1.2719 - return;
1.2720 - }
1.2721 - } while (a[++left] >= a[left - 1]);
1.2722 -
1.2723 - /*
1.2724 - * Every element from adjoining part plays the role
1.2725 - * of sentinel, therefore this allows us to avoid the
1.2726 - * left range check on each iteration. Moreover, we use
1.2727 - * the more optimized algorithm, so called pair insertion
1.2728 - * sort, which is faster (in the context of Quicksort)
1.2729 - * than traditional implementation of insertion sort.
1.2730 - */
1.2731 - for (int k = left; ++left <= right; k = ++left) {
1.2732 - double a1 = a[k], a2 = a[left];
1.2733 -
1.2734 - if (a1 < a2) {
1.2735 - a2 = a1; a1 = a[left];
1.2736 - }
1.2737 - while (a1 < a[--k]) {
1.2738 - a[k + 2] = a[k];
1.2739 - }
1.2740 - a[++k + 1] = a1;
1.2741 -
1.2742 - while (a2 < a[--k]) {
1.2743 - a[k + 1] = a[k];
1.2744 - }
1.2745 - a[k + 1] = a2;
1.2746 - }
1.2747 - double last = a[right];
1.2748 -
1.2749 - while (last < a[--right]) {
1.2750 - a[right + 1] = a[right];
1.2751 - }
1.2752 - a[right + 1] = last;
1.2753 - }
1.2754 - return;
1.2755 - }
1.2756 -
1.2757 - // Inexpensive approximation of length / 7
1.2758 - int seventh = (length >> 3) + (length >> 6) + 1;
1.2759 -
1.2760 - /*
1.2761 - * Sort five evenly spaced elements around (and including) the
1.2762 - * center element in the range. These elements will be used for
1.2763 - * pivot selection as described below. The choice for spacing
1.2764 - * these elements was empirically determined to work well on
1.2765 - * a wide variety of inputs.
1.2766 - */
1.2767 - int e3 = (left + right) >>> 1; // The midpoint
1.2768 - int e2 = e3 - seventh;
1.2769 - int e1 = e2 - seventh;
1.2770 - int e4 = e3 + seventh;
1.2771 - int e5 = e4 + seventh;
1.2772 -
1.2773 - // Sort these elements using insertion sort
1.2774 - if (a[e2] < a[e1]) { double t = a[e2]; a[e2] = a[e1]; a[e1] = t; }
1.2775 -
1.2776 - if (a[e3] < a[e2]) { double t = a[e3]; a[e3] = a[e2]; a[e2] = t;
1.2777 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.2778 - }
1.2779 - if (a[e4] < a[e3]) { double t = a[e4]; a[e4] = a[e3]; a[e3] = t;
1.2780 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.2781 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.2782 - }
1.2783 - }
1.2784 - if (a[e5] < a[e4]) { double t = a[e5]; a[e5] = a[e4]; a[e4] = t;
1.2785 - if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t;
1.2786 - if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t;
1.2787 - if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; }
1.2788 - }
1.2789 - }
1.2790 - }
1.2791 -
1.2792 - // Pointers
1.2793 - int less = left; // The index of the first element of center part
1.2794 - int great = right; // The index before the first element of right part
1.2795 -
1.2796 - if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
1.2797 - /*
1.2798 - * Use the second and fourth of the five sorted elements as pivots.
1.2799 - * These values are inexpensive approximations of the first and
1.2800 - * second terciles of the array. Note that pivot1 <= pivot2.
1.2801 - */
1.2802 - double pivot1 = a[e2];
1.2803 - double pivot2 = a[e4];
1.2804 -
1.2805 - /*
1.2806 - * The first and the last elements to be sorted are moved to the
1.2807 - * locations formerly occupied by the pivots. When partitioning
1.2808 - * is complete, the pivots are swapped back into their final
1.2809 - * positions, and excluded from subsequent sorting.
1.2810 - */
1.2811 - a[e2] = a[left];
1.2812 - a[e4] = a[right];
1.2813 -
1.2814 - /*
1.2815 - * Skip elements, which are less or greater than pivot values.
1.2816 - */
1.2817 - while (a[++less] < pivot1);
1.2818 - while (a[--great] > pivot2);
1.2819 -
1.2820 - /*
1.2821 - * Partitioning:
1.2822 - *
1.2823 - * left part center part right part
1.2824 - * +--------------------------------------------------------------+
1.2825 - * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
1.2826 - * +--------------------------------------------------------------+
1.2827 - * ^ ^ ^
1.2828 - * | | |
1.2829 - * less k great
1.2830 - *
1.2831 - * Invariants:
1.2832 - *
1.2833 - * all in (left, less) < pivot1
1.2834 - * pivot1 <= all in [less, k) <= pivot2
1.2835 - * all in (great, right) > pivot2
1.2836 - *
1.2837 - * Pointer k is the first index of ?-part.
1.2838 - */
1.2839 - outer:
1.2840 - for (int k = less - 1; ++k <= great; ) {
1.2841 - double ak = a[k];
1.2842 - if (ak < pivot1) { // Move a[k] to left part
1.2843 - a[k] = a[less];
1.2844 - /*
1.2845 - * Here and below we use "a[i] = b; i++;" instead
1.2846 - * of "a[i++] = b;" due to performance issue.
1.2847 - */
1.2848 - a[less] = ak;
1.2849 - ++less;
1.2850 - } else if (ak > pivot2) { // Move a[k] to right part
1.2851 - while (a[great] > pivot2) {
1.2852 - if (great-- == k) {
1.2853 - break outer;
1.2854 - }
1.2855 - }
1.2856 - if (a[great] < pivot1) { // a[great] <= pivot2
1.2857 - a[k] = a[less];
1.2858 - a[less] = a[great];
1.2859 - ++less;
1.2860 - } else { // pivot1 <= a[great] <= pivot2
1.2861 - a[k] = a[great];
1.2862 - }
1.2863 - /*
1.2864 - * Here and below we use "a[i] = b; i--;" instead
1.2865 - * of "a[i--] = b;" due to performance issue.
1.2866 - */
1.2867 - a[great] = ak;
1.2868 - --great;
1.2869 - }
1.2870 - }
1.2871 -
1.2872 - // Swap pivots into their final positions
1.2873 - a[left] = a[less - 1]; a[less - 1] = pivot1;
1.2874 - a[right] = a[great + 1]; a[great + 1] = pivot2;
1.2875 -
1.2876 - // Sort left and right parts recursively, excluding known pivots
1.2877 - sort(a, left, less - 2, leftmost);
1.2878 - sort(a, great + 2, right, false);
1.2879 -
1.2880 - /*
1.2881 - * If center part is too large (comprises > 4/7 of the array),
1.2882 - * swap internal pivot values to ends.
1.2883 - */
1.2884 - if (less < e1 && e5 < great) {
1.2885 - /*
1.2886 - * Skip elements, which are equal to pivot values.
1.2887 - */
1.2888 - while (a[less] == pivot1) {
1.2889 - ++less;
1.2890 - }
1.2891 -
1.2892 - while (a[great] == pivot2) {
1.2893 - --great;
1.2894 - }
1.2895 -
1.2896 - /*
1.2897 - * Partitioning:
1.2898 - *
1.2899 - * left part center part right part
1.2900 - * +----------------------------------------------------------+
1.2901 - * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
1.2902 - * +----------------------------------------------------------+
1.2903 - * ^ ^ ^
1.2904 - * | | |
1.2905 - * less k great
1.2906 - *
1.2907 - * Invariants:
1.2908 - *
1.2909 - * all in (*, less) == pivot1
1.2910 - * pivot1 < all in [less, k) < pivot2
1.2911 - * all in (great, *) == pivot2
1.2912 - *
1.2913 - * Pointer k is the first index of ?-part.
1.2914 - */
1.2915 - outer:
1.2916 - for (int k = less - 1; ++k <= great; ) {
1.2917 - double ak = a[k];
1.2918 - if (ak == pivot1) { // Move a[k] to left part
1.2919 - a[k] = a[less];
1.2920 - a[less] = ak;
1.2921 - ++less;
1.2922 - } else if (ak == pivot2) { // Move a[k] to right part
1.2923 - while (a[great] == pivot2) {
1.2924 - if (great-- == k) {
1.2925 - break outer;
1.2926 - }
1.2927 - }
1.2928 - if (a[great] == pivot1) { // a[great] < pivot2
1.2929 - a[k] = a[less];
1.2930 - /*
1.2931 - * Even though a[great] equals to pivot1, the
1.2932 - * assignment a[less] = pivot1 may be incorrect,
1.2933 - * if a[great] and pivot1 are floating-point zeros
1.2934 - * of different signs. Therefore in float and
1.2935 - * double sorting methods we have to use more
1.2936 - * accurate assignment a[less] = a[great].
1.2937 - */
1.2938 - a[less] = a[great];
1.2939 - ++less;
1.2940 - } else { // pivot1 < a[great] < pivot2
1.2941 - a[k] = a[great];
1.2942 - }
1.2943 - a[great] = ak;
1.2944 - --great;
1.2945 - }
1.2946 - }
1.2947 - }
1.2948 -
1.2949 - // Sort center part recursively
1.2950 - sort(a, less, great, false);
1.2951 -
1.2952 - } else { // Partitioning with one pivot
1.2953 - /*
1.2954 - * Use the third of the five sorted elements as pivot.
1.2955 - * This value is inexpensive approximation of the median.
1.2956 - */
1.2957 - double pivot = a[e3];
1.2958 -
1.2959 - /*
1.2960 - * Partitioning degenerates to the traditional 3-way
1.2961 - * (or "Dutch National Flag") schema:
1.2962 - *
1.2963 - * left part center part right part
1.2964 - * +-------------------------------------------------+
1.2965 - * | < pivot | == pivot | ? | > pivot |
1.2966 - * +-------------------------------------------------+
1.2967 - * ^ ^ ^
1.2968 - * | | |
1.2969 - * less k great
1.2970 - *
1.2971 - * Invariants:
1.2972 - *
1.2973 - * all in (left, less) < pivot
1.2974 - * all in [less, k) == pivot
1.2975 - * all in (great, right) > pivot
1.2976 - *
1.2977 - * Pointer k is the first index of ?-part.
1.2978 - */
1.2979 - for (int k = less; k <= great; ++k) {
1.2980 - if (a[k] == pivot) {
1.2981 - continue;
1.2982 - }
1.2983 - double ak = a[k];
1.2984 - if (ak < pivot) { // Move a[k] to left part
1.2985 - a[k] = a[less];
1.2986 - a[less] = ak;
1.2987 - ++less;
1.2988 - } else { // a[k] > pivot - Move a[k] to right part
1.2989 - while (a[great] > pivot) {
1.2990 - --great;
1.2991 - }
1.2992 - if (a[great] < pivot) { // a[great] <= pivot
1.2993 - a[k] = a[less];
1.2994 - a[less] = a[great];
1.2995 - ++less;
1.2996 - } else { // a[great] == pivot
1.2997 - /*
1.2998 - * Even though a[great] equals to pivot, the
1.2999 - * assignment a[k] = pivot may be incorrect,
1.3000 - * if a[great] and pivot are floating-point
1.3001 - * zeros of different signs. Therefore in float
1.3002 - * and double sorting methods we have to use
1.3003 - * more accurate assignment a[k] = a[great].
1.3004 - */
1.3005 - a[k] = a[great];
1.3006 - }
1.3007 - a[great] = ak;
1.3008 - --great;
1.3009 - }
1.3010 - }
1.3011 -
1.3012 - /*
1.3013 - * Sort left and right parts recursively.
1.3014 - * All elements from center part are equal
1.3015 - * and, therefore, already sorted.
1.3016 - */
1.3017 - sort(a, left, less - 1, leftmost);
1.3018 - sort(a, great + 1, right, false);
1.3019 - }
1.3020 - }
1.3021 -}