Top down Merge Sort code in Java:
package com.kpatil.sort;
public class MergeSort {
public static void sort(int[] list) {
int[] aux = new int[list.length];
sort(list, aux, 0, list.length - 1);
}
public static void sort(int[] list, int[] aux, int left, int right) {
if (right <= left) {
return;
}
int mid = left + (right - left) / 2;
sort(list, aux, left, mid); // sort first half recursively
sort(list, aux, mid + 1, right); // sort second half recursively
merge(list, aux, left, mid, right); // merge two sorted halves
}
public static void merge(int[] list, int[] aux, int left, int mid, int right) {
for (int k = left; k <= right; k++) {
aux[k] = list[k];
}
int i = left;
int j = mid + 1;
for (int k = left; k <= right; k++) {
if (i > mid) {
list[k] = aux[j];
j++;
} else if (j > right) {
list[k] = aux[i];
i++;
} else if (aux[j] < aux[i]) {
list[k] = aux[j];
j++;
} else {
list[k] = aux[i];
i++;
}
}
}
}
JUnit test cases:
package com.kpatil.test;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
import com.kpatil.sort.MergeSort;
public class MergeSortTest {
@Test
public void test1() {
int[] array = { 5, 2, 89, 0, 10, 3, 20, 1 };
int[] sorted = { 0, 1, 2, 3, 5, 10, 20, 89 };
MergeSort.sort(array);
assertEquals(true, Arrays.equals(array, sorted));
}
@Test
public void test2() {
int SIZE = 1000;
int[] list = new int[SIZE];
int[] expectedList = new int[SIZE];
for (int i = 0; i < SIZE; i++) {
int rand = (int) (Math.random() * SIZE);
list[i] = rand;
expectedList[i] = rand;
}
MergeSort.sort(list);
System.out.println("------------------");
Arrays.sort(expectedList);
assertEquals(true, Arrays.equals(list, expectedList));
for (int i = 0; i < SIZE; i++) {
System.out.print(list[i] + " ");
}
System.out.println();
}
}