public class MergeAnimate
{

    private static void merge2(double[] a, double[] aux, int left, int mid, int right) {
        for (int i = left; i < mid;   i++) aux[i] = a[i];
        for (int j = mid;  j < right; j++) aux[j] = a[mid + right - j - 1];
        int i = left, j = right - 1;
	//        for (int k = left; k < right; k++)
	//            if (less(aux[j], aux[i])) a[k] = aux[j--];    // make it stable
	//            else                      a[k] = aux[i++];
    }

    // without sentinel
    private static void merge(double[] a, int l, int m, int r, int N)
    {
        for (int k = l; k < r; k++) Animate.exch(a, N+k, k);
        int i = l, j = m;
        for (int k = l; k < r; k++)
            if      (i >= m)                    Animate.exch(a, k, N+(j++));
            else if (j >= r)                    Animate.exch(a, k, N+(i++));
            else if (Animate.less(a, N+j, N+i)) Animate.exch(a, k, N+(j++));
            else                                Animate.exch(a, k, N+(i++));
    }

    private static void sort(double[] a, int left, int right, int N)
    {
        if (right <= left + 1) return;
        int mid = left + (right - left) / 2;
        sort(a, left, mid, N);  
        sort(a, mid, right, N);
        merge(a, left, mid, right, N);
    }

    public static void sort(double[] a) {
        sort(a, 0, a.length/2, a.length/2);
    }

   public static void main(String args[]) 
   {
      int N = Integer.parseInt(args[0]);
      double[] a = new double[2*N];
      for (int i = 0; i < N; i++)
         a[i] = Math.random();
      Animate.initialize(a);
      sort(a);
   }
}

