public class RecursiveSorts
{
//-----------------------------------------------------------------
// Sorts the specified array of integers using merge sort.
//-----------------------------------------------------------------
public static void mergeSort (int[] numbers)
{
doMergeSort(numbers, 0, numbers.length - 1);
}
//-----------------------------------------------------------------
// Recursively sorts the the portion of the given array beginning
// at start and ending at end.
//-----------------------------------------------------------------
private static void doMergeSort (int[] numbers, int start, int end)
{
if (start < end)
{
int middle = (start + end) / 2;
doMergeSort (numbers, start, middle);
doMergeSort (numbers, middle + 1, end);
merge (numbers, start, middle, end);
}
}
//-----------------------------------------------------------------
// Merges in sorted order the two sorted subarrays
// [start, middle] and [middle + 1, end].
//-----------------------------------------------------------------
private static void merge (int[] numbers, int start, int middle,
int end)
{
// This temporary array will be used to build the merged list.
int[] tmp = new int[end - start + 1];
int index1 = start;
int index2 = middle + 1;
int indexTmp = 0;
// Loop until one of the sublists is exhausted, adding the smaller
// of the first elements of each sublist to the merged list.
while (index1 <= middle && index2 <= end)
{
if (numbers[index1] <= numbers[index2])
{
tmp[indexTmp] = numbers[index1];
index1++;
}
else
{
tmp[indexTmp] = numbers[index2];
index2++;
}
indexTmp++;
}
// Add to the merged list the remaining elements of whichever sublist
// is not yet exhausted.
while (index1 <= middle)
{
tmp[indexTmp] = numbers[index1];
index1++;
indexTmp++;
}
while (index2 <= end)
{
tmp[indexTmp] = numbers[index2];
index2++;
indexTmp++;
}
// Copy the merged list from tmp into numbers.
for (indexTmp = 0; indexTmp < tmp.length; indexTmp++)
{
numbers[start + indexTmp] = tmp[indexTmp];
}
}
}