void merge(int[] a, int p, int m, int r) {
int[] L = Arrays.copyOfRange(a, p, m + 1);
int[] R = Arrays.copyOfRange(a, m + 1, r + 1);
int i = 0, j = 0;
while (p <= r && i < L.length && j < R.length) {
if (L[i] <= R[j])
a[p++] = L[i++];
else
a[p++] = R[j++];
}
if (i < L.length)
System.arraycopy(L, i, a, p, L.length - i);
if (j < R.length)
System.arraycopy(R, j, a, p, R.length - j);
}
@Test
public void TestMerge() {
int[] a = { 1, 2, 3, 3, 5, 99, 100, 2, 4, 6, 7, 8 };
merge(a, 0, 6, a.length - 1);
System.out.println(a);
}
void mergeSort(int[] a, int p, int r) {
if (p >= r)
return;
int m = (p + r) / 2;
mergeSort(a, p, m);
mergeSort(a, m + 1, r);
merge(a, p, m, r);
}
@Test
public void TestMergeSort() {
int[][] a = { {1,1,1,1,1,1,1}, {1,2,3,4,5,6}, {6,5,4,3,2,1}, {8,4,4,8,21,7,5,23,8,4,24},{} };
for(int [] arr:a){
mergeSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr)) ;
}
}