|
|
|
|
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; merge(A, s, m, e, H); // We have discussed merge() previously ! } |
|
|
DEMO: 14-sort/10-merge-sort/Demo3.java
|
|
|
|
|
|
|
|
|
DEMO: demo/14-sort/12b-non-recursive-merge-sort/MergeSort.java + Demo.java