import DPJRuntime.*;
import java.util.Random;
/**
* 4-way split version of merge sort
*/
public class MergeSort4 extends MergeSort {
public MergeSort4(String[] args) {
super("MergeSort4",args);
}
@Override
public <region R1,R2 | R1:* # R2:*>
void sort(ArraySliceInt<R1> A, ArraySliceInt<R2> B)
writes R1 : *, R2 : *
{
if (A.length <= QUICK_SIZE) {
quickSort(A);
} else {
int q = A.length/4;
ArrayInt<Local> idxs = new ArrayInt<Local>(3);
idxs[0] = q;
idxs[1] = 2*q;
idxs[2] = 3*q;
final PartitionInt<R1> A_quarters =
new PartitionInt<R1>(A, idxs);
final PartitionInt<R2> B_quarters =
new PartitionInt<R2>(B, idxs);
final PartitionInt<R2> B_halves =
new PartitionInt<R2>(B, 2*q);
cobegin {
sort(A_quarters.get(0), B_quarters.get(0));
sort(A_quarters.get(1), B_quarters.get(1));
sort(A_quarters.get(2), B_quarters.get(2));
sort(A_quarters.get(3), B_quarters.get(3));
}
cobegin {
merge(A_quarters.get(0),
A_quarters.get(1),
B_halves.get(0));
merge(A_quarters.get(2),
A_quarters.get(3),
B_halves.get(1));
}
merge(B_halves.get(0),
B_halves.get(1),
A);
}
}
public static void main(String[] args) {
MergeSort4 ms = new MergeSort4(args);
ms.run();
}
}