jdk/src/share/classes/java/util/ArraysParallelSortHelpers.java
author naoto
Thu, 14 Mar 2013 11:29:16 -0700
changeset 16481 8e30386cc014
parent 14925 72729557c226
child 17712 b56c69500af6
permissions -rw-r--r--
8008576: Calendar mismatch using Host LocaleProviderAdapter Reviewed-by: okutsu
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14925
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
     1
/*
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
     2
 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
     4
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    10
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    15
 * accompanied this code).
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    16
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    20
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    23
 * questions.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    24
 */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    25
package java.util;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    26
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    27
import java.util.concurrent.RecursiveAction;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    28
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    29
/**
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    30
 * Helper utilities for the parallel sort methods in Arrays.parallelSort.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    31
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    32
 * For each primitive type, plus Object, we define a static class to
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    33
 * contain the Sorter and Merger implementations for that type:
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    34
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    35
 * Sorter classes based mainly on CilkSort
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    36
 * <A href="http://supertech.lcs.mit.edu/cilk/"> Cilk</A>:
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    37
 * Basic algorithm:
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    38
 * if array size is small, just use a sequential quicksort (via Arrays.sort)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    39
 *         Otherwise:
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    40
 *         1. Break array in half.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    41
 *         2. For each half,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    42
 *             a. break the half in half (i.e., quarters),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    43
 *             b. sort the quarters
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    44
 *             c. merge them together
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    45
 *         3. merge together the two halves.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    46
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    47
 * One reason for splitting in quarters is that this guarantees
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    48
 * that the final sort is in the main array, not the workspace
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    49
 * array.  (workspace and main swap roles on each subsort step.)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    50
 * Leaf-level sorts use a Sequential quicksort, that in turn uses
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    51
 * insertion sort if under threshold.  Otherwise it uses median of
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    52
 * three to pick pivot, and loops rather than recurses along left
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    53
 * path.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    54
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    55
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    56
 * Merger classes perform merging for Sorter. If big enough, splits Left
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    57
 * partition in half; finds the greatest point in Right partition
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    58
 * less than the beginning of the second half of Left via binary
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    59
 * search; and then, in parallel, merges left half of Left with
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    60
 * elements of Right up to split point, and merges right half of
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    61
 * Left with elements of R past split point. At leaf, it just
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    62
 * sequentially merges. This is all messy to code; sadly we need
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    63
 * distinct versions for each type.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    64
 *
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    65
 */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    66
/*package*/ class ArraysParallelSortHelpers {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    67
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    68
    // RFE: we should only need a working array as large as the subarray
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    69
    //      to be sorted, but the logic assumes that indices in the two
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    70
    //      arrays always line-up
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    71
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    72
    /** byte support class */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    73
    static final class FJByte {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    74
        static final class Sorter extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    75
            static final long serialVersionUID = 749471161188027634L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    76
            final byte[] a;     // array to be sorted.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    77
            final byte[] w;     // workspace for merge
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    78
            final int origin;   // origin of the part of array we deal with
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    79
            final int n;        // Number of elements in (sub)arrays.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    80
            final int gran;     // split control
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    81
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    82
            Sorter(byte[] a, byte[] w, int origin, int n, int gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    83
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    84
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    85
                this.origin = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    86
                this.n = n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    87
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    88
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    89
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    90
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    91
                final int l = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    92
                final int g = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    93
                final int n = this.n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    94
                final byte[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    95
                final byte[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    96
                if (n > g) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    97
                    int h = n >>> 1; // half
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    98
                    int q = n >>> 2; // lower quarter index
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
    99
                    int u = h + q;   // upper quarter
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   100
                    FJSubSorter ls = new FJSubSorter(new Sorter(a, w, l, q,  g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   101
                                                     new Sorter(a, w, l+q, h-q, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   102
                                                     new Merger(a, w, l,   q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   103
                                                                l+q, h-q, l, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   104
                    FJSubSorter rs = new FJSubSorter(new Sorter(a, w, l+h, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   105
                                                     new Sorter(a, w, l+u, n-u, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   106
                                                     new Merger(a, w, l+h, q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   107
                                                                l+u, n-u, l+h, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   108
                    rs.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   109
                    ls.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   110
                    if (rs.tryUnfork()) rs.compute(); else rs.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   111
                    new Merger(w, a, l, h,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   112
                               l+h, n-h, l, g, null).compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   113
                } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   114
                    DualPivotQuicksort.sort(a, l, l+n-1);   //skip rangeCheck
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   115
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   116
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   117
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   118
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   119
        static final class Merger extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   120
            static final long serialVersionUID = -9090258248781844470L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   121
            final byte[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   122
            final byte[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   123
            final int lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   124
            final int ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   125
            final int ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   126
            final int rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   127
            final int wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   128
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   129
            final Merger next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   130
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   131
            Merger(byte[] a, byte[] w, int lo, int ln, int ro, int rn, int wo,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   132
                   int gran, Merger next) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   133
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   134
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   135
                this.lo = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   136
                this.ln = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   137
                this.ro = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   138
                this.rn = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   139
                this.wo = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   140
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   141
                this.next = next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   142
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   143
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   144
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   145
                final byte[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   146
                final byte[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   147
                Merger rights = null;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   148
                int nleft = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   149
                int nright = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   150
                while (nleft > gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   151
                    int lh = nleft >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   152
                    int splitIndex = lo + lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   153
                    byte split = a[splitIndex];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   154
                    int rl = 0;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   155
                    int rh = nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   156
                    while (rl < rh) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   157
                        int mid = (rl + rh) >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   158
                        if (split <= a[ro + mid])
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   159
                            rh = mid;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   160
                        else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   161
                            rl = mid + 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   162
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   163
                    (rights = new Merger(a, w, splitIndex, nleft-lh, ro+rh,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   164
                                         nright-rh, wo+lh+rh, gran, rights)).fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   165
                    nleft = lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   166
                    nright = rh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   167
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   168
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   169
                int l = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   170
                int lFence = l + nleft;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   171
                int r = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   172
                int rFence = r + nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   173
                int k = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   174
                while (l < lFence && r < rFence) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   175
                    byte al = a[l];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   176
                    byte ar = a[r];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   177
                    byte t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   178
                    if (al <= ar) {++l; t=al;} else {++r; t = ar;}
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   179
                    w[k++] = t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   180
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   181
                while (l < lFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   182
                    w[k++] = a[l++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   183
                while (r < rFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   184
                    w[k++] = a[r++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   185
                while (rights != null) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   186
                    if (rights.tryUnfork())
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   187
                        rights.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   188
                    else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   189
                        rights.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   190
                    rights = rights.next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   191
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   192
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   193
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   194
    } // FJByte
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   195
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   196
    /** char support class */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   197
    static final class FJChar {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   198
        static final class Sorter extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   199
            static final long serialVersionUID = 8723376019074596641L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   200
            final char[] a;     // array to be sorted.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   201
            final char[] w;     // workspace for merge
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   202
            final int origin;   // origin of the part of array we deal with
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   203
            final int n;        // Number of elements in (sub)arrays.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   204
            final int gran;     // split control
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   205
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   206
            Sorter(char[] a, char[] w, int origin, int n, int gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   207
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   208
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   209
                this.origin = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   210
                this.n = n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   211
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   212
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   213
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   214
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   215
                final int l = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   216
                final int g = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   217
                final int n = this.n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   218
                final char[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   219
                final char[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   220
                if (n > g) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   221
                    int h = n >>> 1; // half
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   222
                    int q = n >>> 2; // lower quarter index
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   223
                    int u = h + q;   // upper quarter
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   224
                    FJSubSorter ls = new FJSubSorter(new Sorter(a, w, l, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   225
                                                     new Sorter(a, w, l+q, h-q, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   226
                                                     new Merger(a, w, l,   q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   227
                                                                l+q, h-q, l, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   228
                    FJSubSorter rs = new FJSubSorter(new Sorter(a, w, l + h, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   229
                                                     new Sorter(a, w, l+u, n-u, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   230
                                                     new Merger(a, w, l+h, q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   231
                                                                l+u, n-u, l+h, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   232
                    rs.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   233
                    ls.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   234
                    if (rs.tryUnfork()) rs.compute(); else rs.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   235
                    new Merger(w, a, l, h, l + h, n - h, l, g, null).compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   236
                } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   237
                    DualPivotQuicksort.sort(a, l, l+n-1);   // skip rangeCheck
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   238
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   239
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   240
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   241
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   242
        static final class Merger extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   243
            static final long serialVersionUID = -1383975444621698926L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   244
            final char[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   245
            final char[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   246
            final int lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   247
            final int ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   248
            final int ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   249
            final int rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   250
            final int wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   251
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   252
            final Merger next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   253
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   254
            Merger(char[] a, char[] w, int lo, int ln, int ro, int rn, int wo,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   255
                   int gran, Merger next) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   256
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   257
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   258
                this.lo = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   259
                this.ln = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   260
                this.ro = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   261
                this.rn = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   262
                this.wo = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   263
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   264
                this.next = next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   265
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   266
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   267
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   268
                final char[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   269
                final char[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   270
                Merger rights = null;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   271
                int nleft = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   272
                int nright = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   273
                while (nleft > gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   274
                    int lh = nleft >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   275
                    int splitIndex = lo + lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   276
                    char split = a[splitIndex];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   277
                    int rl = 0;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   278
                    int rh = nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   279
                    while (rl < rh) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   280
                        int mid = (rl + rh) >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   281
                        if (split <= a[ro + mid])
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   282
                            rh = mid;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   283
                        else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   284
                            rl = mid + 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   285
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   286
                    (rights = new Merger(a, w, splitIndex, nleft-lh, ro+rh,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   287
                                         nright-rh, wo+lh+rh, gran, rights)).fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   288
                    nleft = lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   289
                    nright = rh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   290
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   291
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   292
                int l = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   293
                int lFence = l + nleft;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   294
                int r = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   295
                int rFence = r + nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   296
                int k = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   297
                while (l < lFence && r < rFence) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   298
                    char al = a[l];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   299
                    char ar = a[r];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   300
                    char t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   301
                    if (al <= ar) {++l; t=al;} else {++r; t = ar;}
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   302
                    w[k++] = t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   303
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   304
                while (l < lFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   305
                    w[k++] = a[l++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   306
                while (r < rFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   307
                    w[k++] = a[r++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   308
                while (rights != null) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   309
                    if (rights.tryUnfork())
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   310
                        rights.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   311
                    else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   312
                        rights.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   313
                    rights = rights.next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   314
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   315
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   316
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   317
    } // FJChar
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   318
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   319
    /** short support class */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   320
    static final class FJShort {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   321
        static final class Sorter extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   322
            static final long serialVersionUID = -7886754793730583084L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   323
            final short[] a;    // array to be sorted.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   324
            final short[] w;    // workspace for merge
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   325
            final int origin;   // origin of the part of array we deal with
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   326
            final int n;        // Number of elements in (sub)arrays.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   327
            final int gran;     // split control
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   328
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   329
            Sorter(short[] a, short[] w, int origin, int n, int gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   330
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   331
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   332
                this.origin = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   333
                this.n = n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   334
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   335
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   336
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   337
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   338
                final int l = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   339
                final int g = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   340
                final int n = this.n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   341
                final short[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   342
                final short[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   343
                if (n > g) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   344
                    int h = n >>> 1; // half
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   345
                    int q = n >>> 2; // lower quarter index
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   346
                    int u = h + q;   // upper quarter
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   347
                    FJSubSorter ls = new FJSubSorter(new Sorter(a, w, l, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   348
                                                     new Sorter(a, w, l+q, h-q, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   349
                                                     new Merger(a, w, l,   q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   350
                                                                l+q, h-q, l, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   351
                    FJSubSorter rs = new FJSubSorter(new Sorter(a, w, l + h, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   352
                                                     new Sorter(a, w, l+u, n-u, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   353
                                                     new Merger(a, w, l+h, q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   354
                                                                l+u, n-u, l+h, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   355
                    rs.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   356
                    ls.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   357
                    if (rs.tryUnfork()) rs.compute(); else rs.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   358
                    new Merger(w, a, l, h, l + h, n - h, l, g, null).compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   359
                } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   360
                    DualPivotQuicksort.sort(a, l, l+n-1);   // skip rangeCheck
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   361
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   362
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   363
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   364
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   365
        static final class Merger extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   366
            static final long serialVersionUID = 3895749408536700048L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   367
            final short[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   368
            final short[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   369
            final int lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   370
            final int ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   371
            final int ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   372
            final int rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   373
            final int wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   374
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   375
            final Merger next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   376
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   377
            Merger(short[] a, short[] w, int lo, int ln, int ro, int rn, int wo,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   378
                   int gran, Merger next) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   379
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   380
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   381
                this.lo = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   382
                this.ln = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   383
                this.ro = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   384
                this.rn = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   385
                this.wo = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   386
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   387
                this.next = next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   388
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   389
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   390
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   391
                final short[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   392
                final short[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   393
                Merger rights = null;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   394
                int nleft = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   395
                int nright = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   396
                while (nleft > gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   397
                    int lh = nleft >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   398
                    int splitIndex = lo + lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   399
                    short split = a[splitIndex];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   400
                    int rl = 0;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   401
                    int rh = nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   402
                    while (rl < rh) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   403
                        int mid = (rl + rh) >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   404
                        if (split <= a[ro + mid])
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   405
                            rh = mid;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   406
                        else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   407
                            rl = mid + 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   408
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   409
                    (rights = new Merger(a, w, splitIndex, nleft-lh, ro+rh,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   410
                                         nright-rh, wo+lh+rh, gran, rights)).fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   411
                    nleft = lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   412
                    nright = rh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   413
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   414
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   415
                int l = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   416
                int lFence = l + nleft;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   417
                int r = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   418
                int rFence = r + nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   419
                int k = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   420
                while (l < lFence && r < rFence) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   421
                    short al = a[l];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   422
                    short ar = a[r];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   423
                    short t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   424
                    if (al <= ar) {++l; t=al;} else {++r; t = ar;}
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   425
                    w[k++] = t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   426
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   427
                while (l < lFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   428
                    w[k++] = a[l++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   429
                while (r < rFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   430
                    w[k++] = a[r++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   431
                while (rights != null) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   432
                    if (rights.tryUnfork())
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   433
                        rights.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   434
                    else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   435
                        rights.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   436
                    rights = rights.next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   437
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   438
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   439
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   440
    } // FJShort
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   441
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   442
    /** int support class */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   443
    static final class FJInt {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   444
        static final class Sorter extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   445
            static final long serialVersionUID = 4263311808957292729L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   446
            final int[] a;     // array to be sorted.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   447
            final int[] w;     // workspace for merge
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   448
            final int origin;  // origin of the part of array we deal with
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   449
            final int n;       // Number of elements in (sub)arrays.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   450
            final int gran;    // split control
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   451
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   452
            Sorter(int[] a, int[] w, int origin, int n, int gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   453
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   454
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   455
                this.origin = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   456
                this.n = n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   457
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   458
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   459
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   460
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   461
                final int l = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   462
                final int g = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   463
                final int n = this.n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   464
                final int[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   465
                final int[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   466
                if (n > g) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   467
                    int h = n >>> 1; // half
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   468
                    int q = n >>> 2; // lower quarter index
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   469
                    int u = h + q;   // upper quarter
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   470
                    FJSubSorter ls = new FJSubSorter(new Sorter(a, w, l, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   471
                                                     new Sorter(a, w, l+q, h-q, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   472
                                                     new Merger(a, w, l,   q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   473
                                                                l+q, h-q, l, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   474
                    FJSubSorter rs = new FJSubSorter(new Sorter(a, w, l + h, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   475
                                                     new Sorter(a, w, l+u, n-u, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   476
                                                     new Merger(a, w, l+h, q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   477
                                                                l+u, n-u, l+h, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   478
                    rs.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   479
                    ls.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   480
                    if (rs.tryUnfork()) rs.compute(); else rs.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   481
                    new Merger(w, a, l, h, l + h, n - h, l, g, null).compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   482
                } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   483
                    DualPivotQuicksort.sort(a, l, l+n-1);   // skip rangeCheck
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   484
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   485
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   486
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   487
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   488
        static final class Merger extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   489
            static final long serialVersionUID = -8727507284219982792L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   490
            final int[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   491
            final int[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   492
            final int lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   493
            final int ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   494
            final int ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   495
            final int rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   496
            final int wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   497
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   498
            final Merger next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   499
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   500
            Merger(int[] a, int[] w, int lo, int ln, int ro, int rn, int wo,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   501
                   int gran, Merger next) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   502
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   503
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   504
                this.lo = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   505
                this.ln = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   506
                this.ro = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   507
                this.rn = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   508
                this.wo = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   509
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   510
                this.next = next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   511
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   512
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   513
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   514
                final int[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   515
                final int[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   516
                Merger rights = null;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   517
                int nleft = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   518
                int nright = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   519
                while (nleft > gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   520
                    int lh = nleft >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   521
                    int splitIndex = lo + lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   522
                    int split = a[splitIndex];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   523
                    int rl = 0;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   524
                    int rh = nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   525
                    while (rl < rh) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   526
                        int mid = (rl + rh) >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   527
                        if (split <= a[ro + mid])
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   528
                            rh = mid;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   529
                        else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   530
                            rl = mid + 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   531
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   532
                    (rights = new Merger(a, w, splitIndex, nleft-lh, ro+rh,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   533
                                         nright-rh, wo+lh+rh, gran, rights)).fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   534
                    nleft = lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   535
                    nright = rh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   536
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   537
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   538
                int l = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   539
                int lFence = l + nleft;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   540
                int r = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   541
                int rFence = r + nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   542
                int k = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   543
                while (l < lFence && r < rFence) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   544
                    int al = a[l];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   545
                    int ar = a[r];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   546
                    int t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   547
                    if (al <= ar) {++l; t=al;} else {++r; t = ar;}
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   548
                    w[k++] = t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   549
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   550
                while (l < lFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   551
                    w[k++] = a[l++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   552
                while (r < rFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   553
                    w[k++] = a[r++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   554
                while (rights != null) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   555
                    if (rights.tryUnfork())
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   556
                        rights.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   557
                    else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   558
                        rights.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   559
                    rights = rights.next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   560
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   561
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   562
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   563
    } // FJInt
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   564
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   565
    /** long support class */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   566
    static final class FJLong {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   567
        static final class Sorter extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   568
            static final long serialVersionUID = 6553695007444392455L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   569
            final long[] a;     // array to be sorted.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   570
            final long[] w;     // workspace for merge
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   571
            final int origin;   // origin of the part of array we deal with
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   572
            final int n;        // Number of elements in (sub)arrays.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   573
            final int gran;     // split control
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   574
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   575
            Sorter(long[] a, long[] w, int origin, int n, int gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   576
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   577
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   578
                this.origin = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   579
                this.n = n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   580
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   581
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   582
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   583
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   584
                final int l = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   585
                final int g = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   586
                final int n = this.n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   587
                final long[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   588
                final long[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   589
                if (n > g) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   590
                    int h = n >>> 1; // half
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   591
                    int q = n >>> 2; // lower quarter index
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   592
                    int u = h + q;   // upper quarter
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   593
                    FJSubSorter ls = new FJSubSorter(new Sorter(a, w, l, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   594
                                                     new Sorter(a, w, l+q, h-q, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   595
                                                     new Merger(a, w, l,   q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   596
                                                                l+q, h-q, l, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   597
                    FJSubSorter rs = new FJSubSorter(new Sorter(a, w, l + h, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   598
                                                     new Sorter(a, w, l+u, n-u, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   599
                                                     new Merger(a, w, l+h, q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   600
                                                                l+u, n-u, l+h, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   601
                    rs.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   602
                    ls.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   603
                    if (rs.tryUnfork()) rs.compute(); else rs.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   604
                    new Merger(w, a, l, h, l + h, n - h, l, g, null).compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   605
                } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   606
                    DualPivotQuicksort.sort(a, l, l+n-1);   // skip rangeCheck
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   607
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   608
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   609
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   610
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   611
        static final class Merger extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   612
            static final long serialVersionUID = 8843567516333283861L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   613
            final long[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   614
            final long[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   615
            final int lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   616
            final int ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   617
            final int ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   618
            final int rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   619
            final int wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   620
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   621
            final Merger next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   622
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   623
            Merger(long[] a, long[] w, int lo, int ln, int ro, int rn, int wo,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   624
                   int gran, Merger next) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   625
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   626
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   627
                this.lo = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   628
                this.ln = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   629
                this.ro = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   630
                this.rn = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   631
                this.wo = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   632
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   633
                this.next = next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   634
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   635
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   636
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   637
                final long[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   638
                final long[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   639
                Merger rights = null;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   640
                int nleft = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   641
                int nright = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   642
                while (nleft > gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   643
                    int lh = nleft >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   644
                    int splitIndex = lo + lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   645
                    long split = a[splitIndex];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   646
                    int rl = 0;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   647
                    int rh = nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   648
                    while (rl < rh) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   649
                        int mid = (rl + rh) >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   650
                        if (split <= a[ro + mid])
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   651
                            rh = mid;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   652
                        else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   653
                            rl = mid + 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   654
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   655
                    (rights = new Merger(a, w, splitIndex, nleft-lh, ro+rh,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   656
                      nright-rh, wo+lh+rh, gran, rights)).fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   657
                    nleft = lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   658
                    nright = rh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   659
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   660
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   661
                int l = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   662
                int lFence = l + nleft;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   663
                int r = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   664
                int rFence = r + nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   665
                int k = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   666
                while (l < lFence && r < rFence) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   667
                    long al = a[l];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   668
                    long ar = a[r];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   669
                    long t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   670
                    if (al <= ar) {++l; t=al;} else {++r; t = ar;}
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   671
                    w[k++] = t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   672
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   673
                while (l < lFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   674
                    w[k++] = a[l++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   675
                while (r < rFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   676
                    w[k++] = a[r++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   677
                while (rights != null) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   678
                    if (rights.tryUnfork())
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   679
                        rights.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   680
                    else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   681
                        rights.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   682
                    rights = rights.next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   683
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   684
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   685
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   686
    } // FJLong
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   687
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   688
    /** float support class */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   689
    static final class FJFloat {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   690
        static final class Sorter extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   691
            static final long serialVersionUID = 1602600178202763377L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   692
            final float[] a;    // array to be sorted.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   693
            final float[] w;    // workspace for merge
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   694
            final int origin;   // origin of the part of array we deal with
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   695
            final int n;        // Number of elements in (sub)arrays.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   696
            final int gran;     // split control
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   697
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   698
            Sorter(float[] a, float[] w, int origin, int n, int gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   699
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   700
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   701
                this.origin = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   702
                this.n = n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   703
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   704
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   705
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   706
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   707
                final int l = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   708
                final int g = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   709
                final int n = this.n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   710
                final float[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   711
                final float[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   712
                if (n > g) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   713
                    int h = n >>> 1; // half
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   714
                    int q = n >>> 2; // lower quarter index
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   715
                    int u = h + q;   // upper quarter
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   716
                    FJSubSorter ls = new FJSubSorter(new Sorter(a, w, l, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   717
                                                     new Sorter(a, w, l+q, h-q, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   718
                                                     new Merger(a, w, l,   q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   719
                                                                l+q, h-q, l, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   720
                    FJSubSorter rs = new FJSubSorter(new Sorter(a, w, l + h, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   721
                                                     new Sorter(a, w, l+u, n-u, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   722
                                                     new Merger(a, w, l+h, q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   723
                                                                l+u, n-u, l+h, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   724
                    rs.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   725
                    ls.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   726
                    if (rs.tryUnfork()) rs.compute(); else rs.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   727
                    new Merger(w, a, l, h, l + h, n - h, l, g, null).compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   728
                } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   729
                    DualPivotQuicksort.sort(a, l, l+n-1);   // skip rangeCheck
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   730
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   731
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   732
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   733
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   734
        static final class Merger extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   735
            static final long serialVersionUID = 1518176433845397426L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   736
            final float[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   737
            final float[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   738
            final int lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   739
            final int ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   740
            final int ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   741
            final int rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   742
            final int wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   743
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   744
            final Merger next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   745
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   746
            Merger(float[] a, float[] w, int lo, int ln, int ro, int rn, int wo,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   747
                   int gran, Merger next) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   748
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   749
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   750
                this.lo = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   751
                this.ln = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   752
                this.ro = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   753
                this.rn = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   754
                this.wo = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   755
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   756
                this.next = next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   757
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   758
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   759
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   760
                final float[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   761
                final float[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   762
                Merger rights = null;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   763
                int nleft = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   764
                int nright = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   765
                while (nleft > gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   766
                    int lh = nleft >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   767
                    int splitIndex = lo + lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   768
                    float split = a[splitIndex];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   769
                    int rl = 0;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   770
                    int rh = nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   771
                    while (rl < rh) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   772
                        int mid = (rl + rh) >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   773
                        if (Float.compare(split, a[ro+mid]) <= 0)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   774
                            rh = mid;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   775
                        else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   776
                            rl = mid + 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   777
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   778
                    (rights = new Merger(a, w, splitIndex, nleft-lh, ro+rh,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   779
                                         nright-rh, wo+lh+rh, gran, rights)).fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   780
                    nleft = lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   781
                    nright = rh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   782
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   783
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   784
                int l = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   785
                int lFence = l + nleft;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   786
                int r = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   787
                int rFence = r + nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   788
                int k = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   789
                while (l < lFence && r < rFence) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   790
                    float al = a[l];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   791
                    float ar = a[r];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   792
                    float t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   793
                    if (Float.compare(al, ar) <= 0) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   794
                        ++l;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   795
                        t = al;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   796
                    } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   797
                        ++r;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   798
                        t = ar;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   799
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   800
                    w[k++] = t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   801
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   802
                while (l < lFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   803
                    w[k++] = a[l++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   804
                while (r < rFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   805
                    w[k++] = a[r++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   806
                while (rights != null) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   807
                    if (rights.tryUnfork())
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   808
                        rights.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   809
                    else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   810
                        rights.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   811
                    rights = rights.next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   812
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   813
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   814
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   815
    } // FJFloat
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   816
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   817
    /** double support class */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   818
    static final class FJDouble {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   819
        static final class Sorter extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   820
            static final long serialVersionUID = 2446542900576103244L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   821
            final double[] a;    // array to be sorted.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   822
            final double[] w;    // workspace for merge
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   823
            final int origin;    // origin of the part of array we deal with
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   824
            final int n;         // Number of elements in (sub)arrays.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   825
            final int gran;      // split control
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   826
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   827
            Sorter(double[] a, double[] w, int origin, int n, int gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   828
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   829
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   830
                this.origin = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   831
                this.n = n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   832
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   833
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   834
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   835
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   836
                final int l = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   837
                final int g = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   838
                final int n = this.n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   839
                final double[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   840
                final double[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   841
                if (n > g) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   842
                    int h = n >>> 1; // half
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   843
                    int q = n >>> 2; // lower quarter index
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   844
                    int u = h + q;   // upper quarter
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   845
                    FJSubSorter ls = new FJSubSorter(new Sorter(a, w, l, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   846
                                                     new Sorter(a, w, l+q, h-q, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   847
                                                     new Merger(a, w, l,   q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   848
                                                                l+q, h-q, l, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   849
                    FJSubSorter rs = new FJSubSorter(new Sorter(a, w, l + h, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   850
                                                     new Sorter(a, w, l+u, n-u, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   851
                                                     new Merger(a, w, l+h, q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   852
                                                                l+u, n-u, l+h, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   853
                    rs.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   854
                    ls.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   855
                    if (rs.tryUnfork()) rs.compute(); else rs.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   856
                    new Merger(w, a, l, h, l + h, n - h, l, g, null).compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   857
                } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   858
                    DualPivotQuicksort.sort(a, l, l+n-1);   // skip rangeCheck
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   859
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   860
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   861
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   862
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   863
        static final class Merger extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   864
            static final long serialVersionUID = 8076242187166127592L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   865
            final double[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   866
            final double[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   867
            final int lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   868
            final int ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   869
            final int ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   870
            final int rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   871
            final int wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   872
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   873
            final Merger next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   874
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   875
            Merger(double[] a, double[] w, int lo, int ln, int ro, int rn, int wo,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   876
                   int gran, Merger next) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   877
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   878
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   879
                this.lo = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   880
                this.ln = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   881
                this.ro = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   882
                this.rn = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   883
                this.wo = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   884
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   885
                this.next = next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   886
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   887
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   888
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   889
                final double[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   890
                final double[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   891
                Merger rights = null;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   892
                int nleft = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   893
                int nright = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   894
                while (nleft > gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   895
                    int lh = nleft >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   896
                    int splitIndex = lo + lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   897
                    double split = a[splitIndex];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   898
                    int rl = 0;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   899
                    int rh = nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   900
                    while (rl < rh) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   901
                        int mid = (rl + rh) >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   902
                        if (Double.compare(split, a[ro+mid]) <= 0)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   903
                            rh = mid;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   904
                        else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   905
                            rl = mid + 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   906
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   907
                    (rights = new Merger(a, w, splitIndex, nleft-lh, ro+rh,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   908
                                         nright-rh, wo+lh+rh, gran, rights)).fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   909
                    nleft = lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   910
                    nright = rh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   911
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   912
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   913
                int l = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   914
                int lFence = l + nleft;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   915
                int r = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   916
                int rFence = r + nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   917
                int k = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   918
                while (l < lFence && r < rFence) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   919
                    double al = a[l];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   920
                    double ar = a[r];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   921
                    double t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   922
                    if (Double.compare(al, ar) <= 0) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   923
                        ++l;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   924
                        t = al;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   925
                    } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   926
                        ++r;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   927
                        t = ar;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   928
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   929
                    w[k++] = t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   930
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   931
                while (l < lFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   932
                    w[k++] = a[l++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   933
                while (r < rFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   934
                    w[k++] = a[r++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   935
                while (rights != null) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   936
                    if (rights.tryUnfork())
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   937
                        rights.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   938
                    else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   939
                        rights.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   940
                    rights = rights.next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   941
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   942
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   943
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   944
    } // FJDouble
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   945
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   946
    /** Comparable support class */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   947
    static final class FJComparable {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   948
        static final class Sorter<T extends Comparable<? super T>> extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   949
            static final long serialVersionUID = -1024003289463302522L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   950
            final T[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   951
            final T[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   952
            final int origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   953
            final int n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   954
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   955
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   956
            Sorter(T[] a, T[] w, int origin, int n, int gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   957
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   958
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   959
                this.origin = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   960
                this.n = n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   961
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   962
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   963
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   964
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   965
                final int l = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   966
                final int g = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   967
                final int n = this.n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   968
                final T[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   969
                final T[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   970
                if (n > g) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   971
                    int h = n >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   972
                    int q = n >>> 2;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   973
                    int u = h + q;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   974
                    FJSubSorter ls = new FJSubSorter(new Sorter<>(a, w, l, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   975
                                                     new Sorter<>(a, w, l+q, h-q, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   976
                                                     new Merger<>(a, w, l,   q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   977
                                                                  l+q, h-q, l, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   978
                    FJSubSorter rs = new FJSubSorter(new Sorter<>(a, w, l+h, q,   g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   979
                                                     new Sorter<>(a, w, l+u, n-u, g),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   980
                                                     new Merger<>(a, w, l+h, q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   981
                                                                  l+u, n-u, l+h, g, null));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   982
                    rs.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   983
                    ls.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   984
                    if (rs.tryUnfork()) rs.compute(); else rs.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   985
                    new Merger<>(w, a, l, h, l + h, n - h, l, g, null).compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   986
                } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   987
                    Arrays.sort(a, l, l+n);
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   988
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   989
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   990
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   991
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   992
        static final class Merger<T extends Comparable<? super T>> extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   993
            static final long serialVersionUID = -3989771675258379302L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   994
            final T[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   995
            final T[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   996
            final int lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   997
            final int ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   998
            final int ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
   999
            final int rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1000
            final int wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1001
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1002
            final Merger<T> next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1003
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1004
            Merger(T[] a, T[] w, int lo, int ln, int ro, int rn, int wo,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1005
                   int gran, Merger<T> next) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1006
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1007
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1008
                this.lo = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1009
                this.ln = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1010
                this.ro = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1011
                this.rn = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1012
                this.wo = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1013
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1014
                this.next = next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1015
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1016
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1017
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1018
                final T[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1019
                final T[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1020
                Merger<T> rights = null;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1021
                int nleft = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1022
                int nright = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1023
                while (nleft > gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1024
                    int lh = nleft >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1025
                    int splitIndex = lo + lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1026
                    T split = a[splitIndex];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1027
                    int rl = 0;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1028
                    int rh = nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1029
                    while (rl < rh) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1030
                        int mid = (rl + rh) >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1031
                        if (split.compareTo(a[ro + mid]) <= 0)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1032
                            rh = mid;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1033
                        else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1034
                            rl = mid + 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1035
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1036
                    (rights = new Merger<>(a, w, splitIndex, nleft-lh, ro+rh,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1037
                                           nright-rh, wo+lh+rh, gran, rights)).fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1038
                    nleft = lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1039
                    nright = rh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1040
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1041
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1042
                int l = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1043
                int lFence = l + nleft;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1044
                int r = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1045
                int rFence = r + nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1046
                int k = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1047
                while (l < lFence && r < rFence) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1048
                    T al = a[l];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1049
                    T ar = a[r];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1050
                    T t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1051
                    if (al.compareTo(ar) <= 0) {++l; t=al;} else {++r; t=ar; }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1052
                    w[k++] = t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1053
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1054
                while (l < lFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1055
                    w[k++] = a[l++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1056
                while (r < rFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1057
                    w[k++] = a[r++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1058
                while (rights != null) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1059
                    if (rights.tryUnfork())
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1060
                        rights.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1061
                    else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1062
                        rights.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1063
                    rights = rights.next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1064
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1065
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1066
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1067
    } // FJComparable
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1068
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1069
    /** Object + Comparator support class */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1070
    static final class FJComparator {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1071
        static final class Sorter<T> extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1072
            static final long serialVersionUID = 9191600840025808581L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1073
            final T[] a;       // array to be sorted.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1074
            final T[] w;       // workspace for merge
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1075
            final int origin;  // origin of the part of array we deal with
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1076
            final int n;       // Number of elements in (sub)arrays.
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1077
            final int gran;    // split control
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1078
            final Comparator<? super T> cmp; // Comparator to use
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1079
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1080
            Sorter(T[] a, T[] w, int origin, int n, int gran, Comparator<? super T> cmp) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1081
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1082
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1083
                this.origin = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1084
                this.n = n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1085
                this.cmp = cmp;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1086
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1087
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1088
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1089
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1090
                final int l = origin;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1091
                final int g = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1092
                final int n = this.n;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1093
                final T[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1094
                final T[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1095
                if (n > g) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1096
                    int h = n >>> 1; // half
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1097
                    int q = n >>> 2; // lower quarter index
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1098
                    int u = h + q;   // upper quarter
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1099
                    FJSubSorter ls = new FJSubSorter(new Sorter<>(a, w, l, q,   g, cmp),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1100
                                                     new Sorter<>(a, w, l+q, h-q, g, cmp),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1101
                                                     new Merger<>(a, w, l,   q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1102
                                                                  l+q, h-q, l, g, null, cmp));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1103
                    FJSubSorter rs = new FJSubSorter(new Sorter<>(a, w, l + h, q,   g, cmp),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1104
                                                     new Sorter<>(a, w, l+u, n-u, g, cmp),
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1105
                                                     new Merger<>(a, w, l+h, q,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1106
                                                                  l+u, n-u, l+h, g, null, cmp));
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1107
                    rs.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1108
                    ls.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1109
                    if (rs.tryUnfork()) rs.compute(); else rs.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1110
                    new Merger<>(w, a, l, h, l + h, n - h, l, g, null, cmp).compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1111
                } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1112
                    Arrays.sort(a, l, l+n, cmp);
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1113
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1114
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1115
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1116
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1117
        static final class Merger<T> extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1118
            static final long serialVersionUID = -2679539040379156203L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1119
            final T[] a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1120
            final T[] w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1121
            final int lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1122
            final int ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1123
            final int ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1124
            final int rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1125
            final int wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1126
            final int gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1127
            final Merger<T> next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1128
            final Comparator<? super T> cmp;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1129
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1130
            Merger(T[] a, T[] w, int lo, int ln, int ro, int rn, int wo,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1131
                   int gran, Merger<T> next, Comparator<? super T> cmp) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1132
                this.a = a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1133
                this.w = w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1134
                this.lo = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1135
                this.ln = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1136
                this.ro = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1137
                this.rn = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1138
                this.wo = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1139
                this.gran = gran;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1140
                this.next = next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1141
                this.cmp = cmp;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1142
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1143
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1144
            public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1145
                final T[] a = this.a;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1146
                final T[] w = this.w;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1147
                Merger<T> rights = null;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1148
                int nleft = ln;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1149
                int nright = rn;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1150
                while (nleft > gran) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1151
                    int lh = nleft >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1152
                    int splitIndex = lo + lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1153
                    T split = a[splitIndex];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1154
                    int rl = 0;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1155
                    int rh = nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1156
                    while (rl < rh) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1157
                        int mid = (rl + rh) >>> 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1158
                        if (cmp.compare(split, a[ro+mid]) <= 0)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1159
                            rh = mid;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1160
                        else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1161
                            rl = mid + 1;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1162
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1163
                    (rights = new Merger<>(a, w, splitIndex, nleft-lh, ro+rh,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1164
                                           nright-rh, wo+lh+rh, gran, rights, cmp)).fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1165
                    nleft = lh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1166
                    nright = rh;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1167
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1168
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1169
                int l = lo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1170
                int lFence = l + nleft;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1171
                int r = ro;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1172
                int rFence = r + nright;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1173
                int k = wo;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1174
                while (l < lFence && r < rFence) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1175
                    T al = a[l];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1176
                    T ar = a[r];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1177
                    T t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1178
                    if (cmp.compare(al, ar) <= 0) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1179
                        ++l;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1180
                        t = al;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1181
                    } else {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1182
                        ++r;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1183
                        t = ar;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1184
                    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1185
                    w[k++] = t;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1186
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1187
                while (l < lFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1188
                    w[k++] = a[l++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1189
                while (r < rFence)
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1190
                    w[k++] = a[r++];
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1191
                while (rights != null) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1192
                    if (rights.tryUnfork())
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1193
                        rights.compute();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1194
                    else
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1195
                        rights.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1196
                    rights = rights.next;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1197
                }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1198
            }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1199
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1200
    } // FJComparator
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1201
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1202
    /** Utility class to sort half a partitioned array */
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1203
    private static final class FJSubSorter extends RecursiveAction {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1204
        static final long serialVersionUID = 9159249695527935512L;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1205
        final RecursiveAction left;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1206
        final RecursiveAction right;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1207
        final RecursiveAction merger;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1208
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1209
        FJSubSorter(RecursiveAction left, RecursiveAction right,
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1210
                    RecursiveAction merger) {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1211
            this.left = left;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1212
            this.right = right;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1213
            this.merger = merger;
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1214
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1215
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1216
        public void compute() {
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1217
            right.fork();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1218
            left.invoke();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1219
            right.join();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1220
            merger.invoke();
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1221
        }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1222
    }
72729557c226 8003981: Support Parallel Array Sorting - JEP 103
chegar
parents:
diff changeset
  1223
}