// IE Test: javac QuickSortM3.java; appletviewer QuickSortM3.html
import java.awt.*;
public class QuickSort3way extends Animate
  {	
    boolean equal(double a[], int i, int j)
      { return !less(a, i, j) && !less(a, j, i); }
    void sort(double[] a, int l, int r)
      { quicksort(a, l, r); }
    void quicksort(double a[], int l, int r)
      { 
        if (r <= l) return;
        int i = l-1, j = r, p = l-1, q = r, k;
        for (;;)
          { 
            while (less(a, ++i, r)) ;
            while (less(a, r, --j)) if (j == l) break;
            if (i >= j) break;
            exch(a, i, j);
            if (equal(a, i, r)) { p++; exch(a, p, i); }
            if (equal(a, r, j)) { q--; exch(a, q, j); }
          }
        exch(a, i, r); j = i-1; i = i+1;
        for (k = l  ; k <= p; k++,j--) exch(a, k, j);
        for (k = r-1; k >= q; k--,i++) exch(a, k, i);
        quicksort(a, l, j);
        quicksort(a, i, r); 
      }
  }

