// IE Test: javac Batcher.java; appletviewer Batcher.html
import java.awt.*;
public class Batcher extends Animate
  {	
    static int N;
    void sort(double[] a, int l, int r)
      { N = (l+r)/2; mergesort(a, l, N-1); }
    void compexch(double [] a, int i, int j) 
      { if (less(a, j, i)) exch(a, i, j); }
    void shuffle(double a[], int l, int r)
      { int i, j, m = (l+r)/2;
        for (i = l, j = 0; i <= r; i+=2, j++)
          { exch(a, N+i, l+j); exch(a, N+i+1, m+1+j); }
        for (i = l; i <= r; i++) exch(a, i, N+i);
      }
    void unshuffle(double a[], int l, int r)
      { int i, j, m = (l+r)/2;
        for (i = l, j = 0; i <= r; i+=2, j++)
          { exch(a, N+l+j, i); exch(a, N+m+1+j, i+1); }
        for (i = l; i <= r; i++) exch(a, i, N+i);
      }
    void mergeTD(double a[], int l, int r)
      { int i, m = (l+r)/2;
        if (r == l+1) compexch(a, l, r);
        if (r < l+2) return;
        unshuffle(a, l, r);
        mergeTD(a, l, m); 
        mergeTD(a, m+1, r);
        shuffle(a, l, r);
        for (i = l+1; i < r; i+=2) 
          compexch(a, i, i+1);
      }
    void mergesort(double[] a, int l, int r)
      { int m = (r+l)/2;
        if (r <= l) return;
        mergesort(a, l, m);
        mergesort(a, m+1, r);
        mergeTD(a, l, r);
      }

  }

