public class MergeSort { public static void main(String[] args) { int length=5,min=0,max=9; Comparable[] a1 = createArray(min,max,length); printArray(a1); Comparable[] a2 = mergeSort(a1,0,length-1); printArray(a2); } public static void printArray(Comparable[] a) { for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } System.out.println(); } public static Comparable[] createArray(int min, int max, int length) { Comparable[] a = new Comparable[length]; for (int i = 0; i < a.length; i++) a[i] = MyMath.randInteger(min,max); return a; } public static Comparable[] mergeSort(Comparable[] x, int low, int high) { // at least three elements: if (low < high - 1) { int mid = (low + high)/2; Comparable[] x1 = mergeSort(x, low, mid); Comparable[] x2 = mergeSort(x, mid+1, high); return merge(x1,x2); } // 0,1,or 2 elements: else { int length = high - low +1; Comparable[] r = new Comparable[length]; if (length == 1) r[0] = x[low]; if (length == 2) if(x[low].compareTo(x[high]) < 0) { r[0] = x[low]; r[1] = x[high]; } else { r[0] = x[high]; r[1] = x[low]; } return r; } } public static Comparable[] merge(Comparable[] a1, Comparable[] a2) { Comparable[] m = new Comparable[a1.length + a2.length]; int p1 = 0; int p2 = 0; int pm = 0; while ((p1 < a1.length) && (p2 < a2.length)) if (a1[p1].compareTo(a2[p2]) <= 0) m[pm++] = a1[p1++]; else m[pm++] = a2[p2++]; // either a1 or a2 will empty at this point: for(; p1 < a1.length; p1++) // merge any leftovers from a1 m[pm++] = a1[p1]; for(; p2 < a2.length; p2++) // merge any leftovers from a2 m[pm++] = a2[p2]; return m; } } class MyMath { // Return a random int between low and high, inclusive: public static int randInt(int low, int high) { return (int) (Math.random()*(high-low+1)) + (int) low; } public static Integer randInteger(int low, int high) { return new Integer(randInt(low,high)); } }