import java.util.*; public class MergeSort { public static final int SIZE = 10; public static void main(String[] args) { Random rand = new Random(); int[] a = new int[SIZE]; for (int i = 0; i < a.length; i++) { a[i] = rand.nextInt(SIZE); } System.out.println("BEFORE: " + Arrays.toString(a)); mergeSort(a); System.out.println("AFTER: " + Arrays.toString(a)); } // Rearranges the elements of a into sorted order using // the merge sort algorithm (recursive). public static void mergeSort(int[] a) { if (a.length >= 2) { // split array into two halves int[] left = Arrays.copyOfRange(a, 0, a.length/2); int[] right = Arrays.copyOfRange(a, a.length/2, a.length); // sort the two halves mergeSort(left); mergeSort(right); // merge the sorted halves into a sorted whole merge(a, left, right); } } // pre: left and right are sorted // result.length == left.length + right.length // post: copies the values from left and right // into result so that the values in result // are in sorted order private static void merge(int[] result, int[] left, int[] right) { int i1 = 0; // index into left array int i2 = 0; // index into right array for (int i = 0; i < result.length; i++) { if (i2 >= right.length || (i1 < left.length && left[i1] <= right[i2])) { result[i] = left[i1]; // take from left i1++; } else { result[i] = right[i2]; // take from right i2++; } } } }