|
|
|
|
Review: merge sort algorithm
// Merge sorts the array elements A[s] ... A[e-1] using helper array H
public static <T extends Comparable<T>> void sort(T[] A, int s, int e, T[] H)
{
if ( e - s <= 1 ) // A[s]..A[e] has 0 or 1 element
{
return; // No need to sort an array of 1 element...
}
int m = (e+s)/2; // m = middle of s and e
MergeSort.sort(A, s, m, H);
MergeSort.sort(A, m, e, H);
// Merge both sorted arrays
merge(A, s, m, e, H); // We have discussed merge() previously !
}
|
The hybrid merge sort algorithm uses a different sort algorithm when input size is below some threshold:
// Merge sorts the array elements A[s] ... A[e-1] using helper array H
public static <T extends Comparable<T>> void sort(T[] A, int s, int e, T[] H)
{
if ( e - s <= CUTOFF ) // Use a different sort alg for small inputs
{
SelectionSort.sort(A, s, e);
return;
}
int m = (e+s)/2; // m = middle of s and e
MergeSort.sort(A, s, m, H);
MergeSort.sort(A, m, e, H);
// Merge both sorted arrays
merge(A, s, m, e, H); // We have discussed merge() previously !
}
|
The hybrid merge sort algorithm is called TimSort
|
Another improvement: check if the 2 (sorted) array halves "overlap" before invocating merge( )
// Merge sorts the array elements A[s] ... A[e-1] using helper array H
public static <T extends Comparable<T>> void sort(T[] A, int s, int e, T[] H)
{
if ( e - s <= CUTOFF ) // Use a different sort alg for small inputs
{
SelectionSort.sort(A, s, e);
return;
}
int m = (e+s)/2; // m = middle of s and e
MergeSort.sort(A, s, m, H);
MergeSort.sort(A, m, e, H);
// Merge both sorted arrays only when values overlap
if ( A[m-1] < A[m] ) return; // Small optimization
merge(A, s, m, e, H); // We have discussed merge() previously !
}
|