public class QuickEqAnimateBars
{
    public static void sort(double[] a)
    {
        sort(a, 0, a.length - 1);
    }

    private static void sort(double[] a, int left, int right)
    { 
        if (right <= left) return;
        int i = left-1, j = right;
        int p = left-1, q = right;
        while(true)
        { 
            while (AnimateBars.less(a, ++i, right))
                if (i == right) break;
            while (AnimateBars.less(a, right, --j))
                if (j == left) break;
            if (i >= j) break;
            AnimateBars.exch(a, i, j);
            if (a[i] == a[right]) AnimateBars.exch(a, ++p, i);
            if (a[j] == a[right]) AnimateBars.exch(a, --q, j);
        }
        AnimateBars.exch(a, i, right);
        j = i - 1;
        i = i + 1;
        for (int k = left   ; k <= p; k++) AnimateBars.exch(a, k, j--);
        for (int k = right-1; k >= q; k--) AnimateBars.exch(a, k, i++);
        sort(a, left, j);
        sort(a, i, right); 
    }

   public static void main(String args[]) 
   {
      int N = Integer.parseInt(args[0]);
      int M = Integer.parseInt(args[1]);
      double[] a = new double[N];
      for (int i = 0; i < N; i++)
         a[i] = ((double) StdRandom.uniform(M)+1.0)/(M+1.0);
      AnimateBars.initialize(a);
      sort(a);
   }
}

