class TSQuickSort
 {
  public void sort(PP[] rgo) { sort(rgo, 0, rgo.length - 1); }
  private void sort(PP[] rgo, int nLow0, int nHigh0)
   {
    int nLow = nLow0;
    int nHigh = nHigh0;
    PP ppMid;
    if (nHigh0 > nLow0)
     {
      ppMid = rgo[ (nLow0 + nHigh0) / 2 ];
      while(nLow <= nHigh)
       {
        while((nLow < nHigh0) && lessThan(rgo[nLow], ppMid)) ++nLow;
        while((nLow0 < nHigh) && lessThan(ppMid, rgo[nHigh])) --nHigh;
        if(nLow <= nHigh) swap(rgo, nLow++, nHigh--);
       }
      if(nLow0 < nHigh) sort(rgo, nLow0, nHigh);
      if(nLow < nHigh0) sort(rgo, nLow, nHigh0);
     }
   }
  private void swap(PP[] rgo, int i, int j)
   {
    PP o= rgo[i];
    rgo[i] = rgo[j];
    rgo[j] = o;
   }
  protected boolean superlessThan(Object oFirst,Object oSecond)
   {
    return oFirst.hashCode() < oSecond.hashCode();
   }
  protected boolean lessThan(PP a,PP b)
   {
    return a.zave() < b.zave();
   }
 }
