Collections Data Structure Java

/*
 * The remainder of this file is borrowed from: @(#)QSortAlgorithm.java 1.3 29
 * Feb 1996 James Gosling
 * 
 * Copyright (c) 1994-1996 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for NON-COMMERCIAL or COMMERCIAL purposes and without fee is
 * hereby granted. Please refer to the file
 * http://www.javasoft.com/copy_trademarks.html for further important copyright
 * and trademark information and to http://www.javasoft.com/licensing.html for
 * further important licensing information for the Java (tm) Technology.
 * 
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
 * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
 * NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
 * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES.
 * 
 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE PERFORMANCE,
 * SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR
 * COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE SUPPORT MACHINES, OR
 * WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE SOFTWARE COULD LEAD DIRECTLY TO
 * DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
 * RISK ACTIVITIES"). SUN SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY
 * OF FITNESS FOR HIGH RISK ACTIVITIES.
 */
/**
 * A quick sort demonstration algorithm SortAlgorithm.java
 * 
 * @author James Gosling
 * @author Kevin A. Smith
 * @version @(#)QSortAlgorithm.java 1.3, 29 Feb 1996
 */
/**
 * This is a generic version of C.A.R Hoare's Quick Sort algorithm. This will
 * handle arrays that are already sorted, and arrays with duplicate keys. 

 * 
 * If you think of a one dimensional array as going from the lowest index on the
 * left to the highest index on the right then the parameters to this function
 * are lowest index or left and highest index or right. The first time you call
 * this function it will be with the parameters 0, a.length - 1.
 * 
 * @param a
 *            a string array
 * @param lo0
 *            left boundary of array partition
 * @param hi0
 *            right boundary of array partition
 */
public class Sort {
  void QuickSort(String a[], int lo0, int hi0) {
    int lo = lo0;
    int hi = hi0;
    String 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].compareTo(mid) < 0))
          ++lo;
        /*
         * find an element that is smaller than or equal to the
         * partition element starting from the right Index.
         */
        while ((hi > lo0) && (a[hi].compareTo(mid) > 0))
          --hi;
        // if the indexes have not crossed, swap
        if (lo <= hi) {
          String t = a[hi];
          a[hi] = a[lo];
          a[lo] = t;
          ++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);
    }
  }
}