| Merge Sort |
Our next sorting algorithm proceeds as follows:
The Java method to do it:
public void sort(int[] array) {
// create tempArray for use in merging
int[] tempArray = new int[array.length];
mergeSort(array, 0, array.length-1, tempArray);
}
/*
* PRE: left and right are valid indexes of array.
* tempArray.length == array.length
* POST: Sorts array from left to right.
*/
public void mergeSort(int[] array, int left, int right, int[] tempArray) {
if (left < right) {
int middle = (right + left) / 2;
mergeSort(array, left, middle, tempArray);
mergeSort(array, middle + 1, right, tempArray);
merge(array, left, middle, right, tempArray);
}
}
The method merge takes the sorted elements in array[left..middle] and array[middle+1..right] and merges then together using the array tempArray, and then copies them back into array.
/** PRE: left <= middle <= right and left,middle,right are valid
* indices for array * tempArray.length == array.length
* array[left..middle] and array[middle+1..right] must both be sorted.
* POST: Merges the two halves (array[left..middle] and
* array[middle+1..right]) together, and array[left..right] is then
* sorted.
*/
private void merge(int []array, int left, int middle,
int right, int[] tempArray) {
int indexLeft = left;
int indexRight = middle + 1;
int target = left;
// Copy both pieces into tempArray.
for (int i = left; i <= right; i++) {
tempArray[i] = array[i];
}
// Merge them together back in array while there are
// elements left in both halves.
while (indexLeft <= middle && indexRight <= right) {
if (tempArray[indexLeft] < tempArray[indexRight]) {
array[target] = tempArray[indexLeft];
indexLeft++;
} else {
array[target] = tempArray[indexRight];
indexRight++;
}
target++;
}
// Move any remaining elements from the left half.
while (indexLeft <= middle) {
array[target] = tempArray[indexLeft];
indexLeft++;
target++;
}
// Move any remaining elements from the right half.
while (indexRight <= right) {
array[target] = tempArray[indexRight];
indexRight++;
target++;
}
}
| Merge Sort |