2 * 4-way split version of merge sort
\r
5 public class MergeSort4 extends MergeSort {
\r
7 public static void main(String[] args) {
\r
8 int problemSize = 4194304;
\r
9 if (args.length > 0) {
\r
10 problemSize = Integer.parseInt(args[0]);
\r
12 MergeSort4 sort = new MergeSort4();
\r
13 sort.run(problemSize);
\r
16 public MergeSort4() {
\r
20 public void runWorkAndTest() {
\r
22 int output[]=sort(input, 0, input.length);
\r
25 checkSorted(output);
\r
29 public int[] serializedSort(int A[], int low, int high) {
\r
31 int length = high - low;
\r
33 if (length <= QUICK_SIZE) {
\r
34 int[] R = new int[length];
\r
37 for (int i = 0; i < max; i++) {
\r
40 quickSort(R, 0, R.length - 1);
\r
45 int idxs0 = q + low;
\r
46 int idxs1 = (2 * q) + low;
\r
47 int idxs2 = (3 * q) + low;
\r
49 int[] A_quarters0 = serializedSort(A, low, idxs0);
\r
50 int[] A_quarters1 = serializedSort(A, idxs0, idxs1);
\r
51 int[] A_quarters2 = serializedSort(A, idxs1, idxs2);
\r
52 int[] A_quarters3 = serializedSort(A, idxs2, idxs2 + q);
\r
54 int[] R = new int[high - low];
\r
56 merge(A_quarters0, A_quarters1, A_quarters2, A_quarters3, R);
\r
61 public int[] sort(int A[], int low, int high) {
\r
63 int length=high-low;
\r
65 if (length <= SERIALIZED_CUT_OFF) {
\r
66 return serializedSort(A, low, high);
\r
68 if (length <= QUICK_SIZE) {
\r
69 int[] R = new int[length];
\r
72 for (int i = 0; i < max; i++) {
\r
75 quickSort(R, 0, R.length-1);
\r
81 int idxs1 = (2 * q)+low;
\r
82 int idxs2 = (3 * q)+low;
\r
85 int[] A_quarters0 = sort(A, low, idxs0);
\r
88 int[] A_quarters1 = sort(A, idxs0, idxs1);
\r
91 int[] A_quarters2 = sort(A, idxs1, idxs2);
\r
93 // don't spawn off sese for last one...
\r
94 int[] A_quarters3 = sort(A, idxs2, idxs2+q);
\r
96 int[] R = new int[high - low];
\r
98 merge(A_quarters0, A_quarters1, A_quarters2, A_quarters3, R);
\r
104 public static void merge(int[] a1, int[] a2, int[] a3, int[] a4, int[] a) {
\r
109 int alength = a.length;
\r
114 int v1m = a1.length;
\r
115 int v2m = a2.length;
\r
116 int v3m = a3.length;
\r
117 int v4m = a4.length;
\r
118 for (int i = 0; i < alength; i++) {
\r