2 * 4-way split version of merge sort
\r
5 public class MergeSort4 extends MergeSort {
\r
7 public boolean validationTest;
\r
9 public static void main(String[] args) {
\r
10 int problemSize = 4194304;
\r
11 int parallelBranch=32;
\r
13 MergeSort4 sort = new MergeSort4();
\r
15 if (args.length > 0) {
\r
16 problemSize = Integer.parseInt(args[0]);
\r
18 if (args.length > 1) {
\r
19 parallelBranch = Integer.parseInt(args[1]);
\r
21 if (args.length > 2){
\r
22 sort.validationTest=true;
\r
24 sort.run(problemSize,parallelBranch);
\r
27 public MergeSort4() {
\r
29 validationTest=false;
\r
32 public void runWorkAndTest() {
\r
34 long startT=System.currentTimeMillis();
\r
35 int output[]=sort(input, 0, input.length);
\r
36 long endT=System.currentTimeMillis();
\r
37 System.out.println("running time="+(endT-startT));
\r
41 checkSorted(output);
\r
46 public int[] serializedSort(int A[], int low, int high) {
\r
48 int length = high - low;
\r
50 if (length <= QUICK_SIZE) {
\r
51 int[] R = new int[length];
\r
54 for (int i = 0; i < max; i++) {
\r
57 quickSort(R, 0, R.length - 1);
\r
62 int idxs0 = q + low;
\r
63 int idxs1 = (2 * q) + low;
\r
64 int idxs2 = (3 * q) + low;
\r
66 int[] A_quarters0 = serializedSort(A, low, idxs0);
\r
67 int[] A_quarters1 = serializedSort(A, idxs0, idxs1);
\r
68 int[] A_quarters2 = serializedSort(A, idxs1, idxs2);
\r
69 int[] A_quarters3 = serializedSort(A, idxs2, idxs2 + q);
\r
71 int[] R = new int[high - low];
\r
73 merge(A_quarters0, A_quarters1, A_quarters2, A_quarters3, R);
\r
78 public int[] sort(int A[], int low, int high) {
\r
80 int length=high-low;
\r
82 if (length <= SERIALIZED_CUT_OFF) {
\r
83 return serializedSort(A, low, high);
\r
85 if (length <= QUICK_SIZE) {
\r
86 int[] R = new int[length];
\r
89 for (int i = 0; i < max; i++) {
\r
92 quickSort(R, 0, R.length-1);
\r
98 int idxs1 = (2 * q)+low;
\r
99 int idxs2 = (3 * q)+low;
\r
102 int[] A_quarters0 = sort(A, low, idxs0);
\r
105 int[] A_quarters1 = sort(A, idxs0, idxs1);
\r
108 int[] A_quarters2 = sort(A, idxs1, idxs2);
\r
110 // don't spawn off sese for last one...
\r
111 int[] A_quarters3 = sort(A, idxs2, idxs2+q);
\r
113 int[] R = new int[high - low];
\r
115 merge(A_quarters0, A_quarters1, A_quarters2, A_quarters3, R);
\r
121 public static void merge(int[] a1, int[] a2, int[] a3, int[] a4, int[] a) {
\r
126 int alength = a.length;
\r
131 int v1m = a1.length;
\r
132 int v2m = a2.length;
\r
133 int v3m = a3.length;
\r
134 int v4m = a4.length;
\r
135 for (int i = 0; i < alength; i++) {
\r