// IE Test: javac QuickSortM3.java; appletviewer QuickSortM3.html
import java.awt.*;
public class QuickSortM3 extends Animate
  {	
    void insertion(double[] a, int l, int r)
      { int i;
        for (i = r; i > l; i--) 
          if (less(a, i, i-1)) exch(a, i, i-1);
        for (i = l+2; i <= r; i++)
          { int j = i; 
            while (less(a, j, j-1))
              { exch(a, j, j-1); j--; }
          }
      }
    int partition(double a[], int l, int r)
      { int i = l-1, j = r;
        for (;;)
          { 
            while (less(a, ++i, r)) ;
            while (less(a, r, --j)) if (j == l) break;
            if (i >= j) break;
            exch(a, i, j);
          }
        exch(a, i, r);
        return i;
      }
    private final static int M = 30;
    void quicksort(double[] a, int l, int r)
      { 
        if (r-l <= M) return;
        exch(a, (l+r)/2, r-1);
        if (less(a, r-1, l)) exch(a, l, r-1);
        if (less(a, r, l)) exch(a, l, r);
        if (less(a, r, r-1)) exch(a, r-1, r);
        int i = partition(a, l+1, r-1);
        quicksort(a, l, i-1);
        quicksort(a, i+1, r);
      }
    void sort(double a[], int l, int r)
      { quicksort(a, l, r); insertion(a, l, r); }
  }

