I tried to sort the iterative merge, but got stuck in conditions where the input length is not 2 ^ x.
as int [] A = {4,5,1,254,66,75,12,8,65,4,87,63,53,8,99,54,12,34};
public class MergeSort { public static void sort(int[] A) { System.out.println("Log(A.len):"+log(A.length, 2)); for (int i = 0; i < log(A.length, 2); i++) { //log A.len int r = 2 << i; //2^i int mid = r >>> 1; for (int j = 0; j+r < A.length; j = j + r) { System.out.print("offset:" + j + " mid:" + (j + mid) + " r:" + (j + r)); merge(A, j, (j + mid), (j + r)); } } } public static void merge(int[] A, int offset, int mid, int n) { mid = mid - offset; n = n - offset; int[] L = new int[mid]; int[] R = new int[n - mid]; for (int i = 0; i < mid; i++) { L[i] = A[i + offset]; R[i] = A[mid + i + offset]; } System.out.print("\nL:"); print_array(L); System.out.print("\nR:"); print_array(R); int l = 0; int r = 0; //left right pointer int k = offset; while (l < mid && r < mid) { if (L[l] < R[r]) { // System.out.println("in left"); A[k] = L[l]; l++; } else { // System.out.println("in right"); A[k] = R[r]; r++; } k++; } while (l < mid) { A[k] = L[l]; l++; k++; } while (r < mid) { A[k] = R[r]; r++; k++; } System.out.print("\nA:"); print_array(A); System.out.print("\n\n"); } public static void main(String[] args) { int[] A ={4,5,1,254,66,75,12,8,65,4,87,63,53,8,99,54,12,34}; sort(A); } public static void print_array(int[] A) { for (int i = 0; i < A.length; i++) { System.out.print(A[i] + " "); } } static int log(int x, int base) { return (int) (Math.log(x) / Math.log(base)); } }
It works great when the input length is 2 ^ x.
There is also a better way to implement an iterative version, it looks very dirty.