The merge sort routine tries to break down an array into 2 sub-arrays, sort these sub-arrays, and merge them back, in a recursive way, as you shall see in the implementation below, as well as the graph below.
import java.util.Arrays; import java.util.Random; public class MergeSortTest { static int numberOfElements = 10; static int maxValue = 100; public static void main(String[] args) { int[] original = createArrayWithRandomValues(); // workspace array is used to keep the partial sorted results int[] workspace = new int[original.length]; mergeSort(original, workspace, 0, numberOfElements - 1); System.out.println("The sorted array is " + Arrays.toString(original)); } private static int[] createArrayWithRandomValues() { Random random = new Random(); int[] original = new int[numberOfElements]; for (int i = 0; i < numberOfElements; i++) { original[i] = random.nextInt(maxValue); } System.out.println("The original array is " + Arrays.toString(original)); return original; } private static void mergeSort(int[] original, int[] workSpace, int lowerBound, int upperBound) { if (lowerBound != upperBound) { // find midpoint int mid = (lowerBound + upperBound) / 2; // sort lower half mergeSort(original, workSpace, lowerBound, mid); // sort upper half mergeSort(original, workSpace, mid + 1, upperBound); // merge them merge(original, workSpace, lowerBound, mid, upperBound); } } private static void merge(int[] original, int[] workSpace, int lowerBound, int middle, int upperBound) { // Copy both parts into the workspace array System.arraycopy(original, lowerBound, workSpace, lowerBound, upperBound + 1 - lowerBound); int leftPointer = lowerBound; int rightPointer = middle + 1; int originalPointer = lowerBound; // Copy the smallest values from either the left or the right side back to the original array while (leftPointer <= middle && rightPointer <= upperBound) { if (workSpace[leftPointer] <= workSpace[rightPointer]) { // copy and move the pointer on workspace to the next smallest value on left (if there is any) original[originalPointer++] = workSpace[leftPointer++]; } else { // copy and move the pointer on workspace to the next smallest value on right (if there is any) original[originalPointer++] = workSpace[rightPointer++]; } } // Copy the rest of the left side of the array into the target array while (leftPointer <= middle) { original[originalPointer++] = workSpace[leftPointer++]; } // if there are elements left in the right side of the workspace, those // are the largest values of the merged array, so no action is required } }
No comments:
Post a Comment