// Comment Merge Sort for array public static void mergeSort(int[] A) { if (A == null) throw new NullPointerException("Input doesn't exist."); int len = A.length; if (len == 0) throw new IllegalArgumentException("No input from user."); mergeSortUtil(A, 0, len - 1); } private static void mergeSortUtil(int[] a, int l, int r) { if (l >= r) return; int m = l + (r - l) / 2; mergeSortUtil(a, l, m); mergeSortUtil(a, m + 1, r); merge(a, l, m, r); } private static void merge(int[] a, int l, int m, int r) { int k = 0, i, j; int[] b = new int[(r - l) + 1]; for (i = l, j = m + 1; i <= m && j <= r;) { if (a[i] < a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; } while (i <= m) b[k++] = a[i++]; while (j <= r) b[k++] = a[j++]; for (int s = l, f = 0; f < b.length; s++) { a[s] = b[f++]; } }
Top-down implementation using lists :
function merge_sort(list m) // Base case. A list of zero or one elements is sorted, by definition. if length(m) <= 1 return m // Recursive case. First, *divide* the list into equal-sized sublists. var list left, right var integer middle = length(m) / 2 for each x in m before middle add x to left for each x in m after or equal middle add x to right // Recursively sort both sublists. left = merge_sort(left) right = merge_sort(right) // *Conquer*: merge the now-sorted sublists. return merge(left, right)
In this example, the
merge
function merges the left and right sublists.function merge(left, right) var list result // assign the element of the sublists to 'result' variable until there is no element to merge. while length(left) > 0 or length(right) > 0 if length(left) > 0 and length(right) > 0 // compare the first two element, which is the small one, of each two sublists. if first(left) <= first(right) append first(left) to result left = rest(left) else append first(right) to result right = rest(right) else if length(left) > 0 append first(left) to result left = rest(left) else if length(right) > 0 append first(right) to result right = rest(right) end while return result
public static LNode mergeSortList(LNode list) { int len = length(list); if (len <= 1) return list; LNode left = list, right = null; right = addLeftList(left, len); left = mergeSortList(left); right = mergeSortList(right); LNode res = merge(left, right); return res; } private static int length(LNode list) { int len = 0; for (LNode curr = list; curr != null; curr = curr.next) len++; return len; } private static LNode addLeftList(LNode list, int n) { int m = n / 2; LNode curr = list; for (int i = 0; curr != null && i < m - 1; i++) curr = curr.next; list = curr.next; curr.next = null; return list; } private static LNode merge(LNode left, LNode right) { LNode result = null, curr = null, tmp = null; while (left != null && right != null) { if (left.val < right.val) { curr = left; left = left.next; } else { curr = right; right = right.next; } if (result == null) { result = curr; tmp = curr; } else { tmp.next = curr; tmp = tmp.next; } } if (left != null) tmp.next = left; if (right != null) tmp.next = right; return result; }
No comments:
Post a Comment