/** * Sorts by first splitting the array into two subarrays: one is less or equal to * the first element of the original array, the other is greater or equal to the * same first element. Then recursively sorts the subarrays to make the original * array sorted. * This algorithm is due to Tony Hoare. In Merritt's sorting taxonomy, this * algorithm belongs to the family of sorting where the splitting is hard and * the joining is easy. * @author Dung X. Nguyen - Copyright 1999 - All rights reserved. * @since 11/28/99 */ public class QuickSorter extends ASorter{ public final static QuickSorter Singleton = new QuickSorter (); private QuickSorter(){ } /** * Splits A[lo:hi] in such a way that A[lo:s-1] <= A[s:hi] with lo < s <= hi. * @param A * @param lo < hi. * @param hi > lo. * @return s such that A[lo:s-1] <= A[s:hi], lo < s <= hi. */ public int split(int[] A, int lo, int hi){ int key = A[lo]; int lx = lo; // left index. int rx = hi; // right index. // Invariant 1: key <= A[rx+1:hi]. // Invariant 2: A[lo:lx-1] <= key. // Invariant 3: if lx <= rx, there exists ix in [lo:rx] such that A[ix] <= key. // Invariant 4: if lx <= rx, there exists jx in [lx:hi] such that key <= A[jx]. while (lx <= rx){ while (key < A[rx]){ // will terminate due to invariant 3. rx--; // Invariant 1 is maintained. } // A[rx] <= key <= A[rx+1:hi]; lx <= rx. while (A[lx] < key){ // will terminate due to invariant 4. lx++; // Invariant 2 is maintained. } // A[lo:lx-1] <= key <= A[lx] if (lx <= rx){ // swap A[lx] with A[rx]: int temp = A[lx]; A[lx] = A[rx]; // invariant 3 is maintained. A[rx] = temp; // invariant 4 is maintained. rx--; // invariant 1 is maintained. lx++; // invariant 2 is maintained. } } // rx < lx, A[lo:lx-1] <= key <= A[rx+1:hi], and key = A[lx]. return lx; } /** * @param A A[lo:s-1] and A[s:hi] are sorted, and A[lo:s-1] <= A[s:hi]. * @param lo * @param s in [lo:hi]. * @param hi */ public void join(int[] A, int lo, int s, int hi){ // nothing to do! } public static void main(String[] args){ int[] A = {99, -34, 0, 5, -7, 0, 99}; // int[] A = {99, 99, 99}; // ACID TEST! System.out.println ("A ="); for (int i = 0; i < A.length; i++) { System.out.print (A[i] + " "); } System.out.println (); System.out.println ("Sorting A..."); QuickSorter.Singleton.sort (A, 0, A.length - 1); System.out.println ("Sorted A ="); for (int i = 0; i < A.length; i++) { System.out.print (A[i] + " "); } System.out.println ("\nDone"); } }