/*
 * $Log$
 */

package general;

public class Utility {
  
/**
 * A quick sort demonstration algorithm
 *
 * @author James Gosling
 * @author Kevin A. Smith
 * @version     @(#)QSortAlgorithm.java 1.3, 29 Feb 1996
 */
 public static void QuickSort(Sortable a[], int lo0, int hi0)
//   throws Exception 
   {
      int lo = lo0;
      int hi = hi0;
      Sortable mid;

      if ( hi0 > lo0)
      {

         /* Arbitrarily establishing partition element as the midpoint of
          * the array.
          */
         mid = a[ ( lo0 + hi0 ) / 2 ];

         // loop through the array until indices cross
         while( lo <= hi )
         {
            /* find the first element that is greater than or equal to 
             * the partition element starting from the left Index.
             */
            while( ( lo < hi0 ) && 
		  ( a[lo].getDoubleValue() < mid.getDoubleValue() ) )
               ++lo;

            /* find an element that is smaller than or equal to 
             * the partition element starting from the right Index.
             */
            while( ( hi > lo0 ) && ( a[hi].getDoubleValue()
				    > mid.getDoubleValue() ) )
               --hi;

            // if the indexes have not crossed, swap
            if( lo <= hi ) 
            {
               swap(a, lo, hi);
               ++lo;
               --hi;
            }
         }

         /* If the right index has not reached the left side of array
          * must now sort the left partition.
          */
         if( lo0 < hi )
            QuickSort( a, lo0, hi );

         /* If the left index has not reached the right side of array
          * must now sort the right partition.
          */
         if( lo < hi0 )
            QuickSort( a, lo, hi0 );

      }
   }

   private static void swap(Sortable a[], int i, int j)
   {
      Sortable T;
      T = a[i]; 
      a[i] = a[j];
      a[j] = T;
   }
} // end of class Utility
