Non-recursive bottom-up merge-sort runs in O(nlogn) time as recursive version does.
It is considered a bit faster than recursive merge-sort in practice because it does not make recursive-calls.
There is a detailed description about this implementation at here.
package interviewquestions; import java.util.Comparator; public class MergeSortRoutine { public static <K> void merge(K[] in, K[] out, Comparator<K> comp, int start, int inc) { int end1 = Math.min(start + inc, in.length); int end2 = Math.min(start + 2 * inc, in.length); int x = start; int y = start + inc; int z = start; while (x < end1 && y < end2) if (comp.compare(in[x], in[y]) < 0) out[z++] = in[x++]; else out[z++] = in[y++]; if (x < end1) System.arraycopy(in, x, out, z, end1 - x); else if (y < end2) System.arraycopy(in, y, out, z, end2 - y); } public static <K> void mergeSortBottomUp(K[] orig, Comparator<K> comp) { int n = orig.length; K[] src = orig; K[] dest = (K[]) new Object[n]; K[] temp; for (int i = 1; i < n; i *= 2) { for (int j = 0; j < n; j += 2 * i) merge(src, dest, comp, j, i); temp = src; src = dest; dest = temp; } if (orig != src) System.arraycopy(src, 0, orig, 0, n); } private static class IntComparator<T extends Comparable<T>> implements Comparator<T> { public int compare(T a, T b) { return a.compareTo(b); } } public static void main(String[] args) { Integer[] inputArr = { 45, 23, 11, 89, 77, 98, 4, 28, 65, 43 }; System.out.println("Before sorting integer array with generic mergesort "); for (int i = 0; i < inputArr.length; i++) { System.out.print(inputArr[i] + " "); } mergeSortBottomUp(inputArr, new IntComparator<Integer>()); System.out.println("\nAfter sorting integer array with generic mergesort "); for (int i = 0; i < inputArr.length; i++) { System.out.print(inputArr[i] + " "); } String[] values = { "asd", "basd", "cwe", "awe", "vasd" }; System.out.println("\n\nBefore sorting String array with generic mergesort "); for (int i = 0; i < values.length; i++) { System.out.print(values[i] + " "); } mergeSortBottomUp(values, new IntComparator<String>()); System.out.println("\nAfter sorting String array with generic mergesort "); for (int i = 0; i < values.length; i++) { System.out.print(values[i] + " "); } } }
Above Non-recursive bottom-up Mergesort works for types that implements Comparable interface. Generic Comparator class instace is passed as a parameter to the generic mergeSortBottomUp method.
Create a MergeSortRoutine.java file in your workspace.
When the main method inside the MergeSortRoutine class executed it is going to print :
Before sorting integer array with generic mergesort
45 23 11 89 77 98 4 28 65 43
After sorting integer array with generic mergesort
4 11 23 28 43 45 65 77 89 98
Before sorting String array with generic mergesort
asd basd cwe awe vasd
After sorting String array with generic mergesort
asd awe basd cwe vasd
No comments:
Post a Comment