/**
* Quicksort.java
*
* A class to demonstrate quick sorting.
*
* Created: Sun Feb 16 15:07:55 2003
*
* @author Stuart C. Shapiro
*/
public class Quicksort {
/**
* Sorts the integer array a, using quicksort.
*
* post: a[min .. max] is sorted.
*
* @param a an int
array, part of which is to be sorted.
* @param min the minimum index of the part of a to be sorted.
* @param max the maximum index of the part of a to be sorted.
*/
public static void sort(int[] a, int min, int max) {
if (max-min < 1) {return;}
if (max-min == 1) {
if (a[min] > a[max]) {swap(a, min, max);}
return;
}
// max-min > 1
// => min < max-1
int pivot = a[max];
// a[max] == pivot;
// gefilter is a filter that lets pass items that are >= pivot
int gefilter = max-1; // a[gefilter+1 .. max] >= pivot
// ltfilter is a filter that lets pass items that are < pivot
int ltfilter = min; // a[min .. ltfilter-1] < pivot
// ltfilter < gefilter
while (ltfilter < gefilter) {
// Need to filter a[ltfilter .. gefilter]
while (a[ltfilter] < pivot) { // Note, a[max] == pivot.
ltfilter++;
}
// a[ltfilter] >= pivot
while (gefilter >= ltfilter && a[gefilter] >= pivot) {
gefilter--;
}
// ltfilter > gefilter or a[gefilter] < pivot
if (ltfilter < gefilter) {
swap(a, ltfilter, gefilter);
// a[min .. ltfilter] < pivot <= a[gefilter .. max]
}
} // end of while (ltfilter < gefilter)
/* a[gefilter] < pivot <= a[ltfilter]
* So gefilter < ltfilter
* and a[min .. gefilter] < pivot <= a[ltfilter .. max]
* a[max] = pivot */
swap(a, ltfilter, max);
// a[min .. gefilter] < pivot = a[ltfilter] <= a[ltfilter+1 .. max] */
sort(a, min, gefilter);
sort(a, ltfilter+1, max);
}
/**
* Swaps the values of a[i] and a[j].
*
* post: a[i]@post == a[j]@pre and a[j]@post == a[i]@pre.
*
* @param a an int[]
value
* @param i an int
value
* @param j an int
value
*/
private static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
/**
* Prints an array to System.out, followed by a newline.
*
* @param a an int[]
to be printed.
*/
private static void arrayPrintln (int[] a, int min, int max) {
System.out.print("\t{" + a[min]);
for (int j = min+1; j <= max; j++) {System.out.print(", " + a[j]);}
System.out.println("}");
}
/**
* Tests the sort method.
*
*/
private static void test(int[] a) {
int max = a.length-1;
System.out.print("Original: ");
arrayPrintln(a, 0, max);
sort(a, 0, max);
System.out.print("Sorted: ");
arrayPrintln(a, 0, max);
}
/**
* Demonstrates Quicksort.
*
* @param args a String[]
value
*/
public static void main (String[] args) {
test(new int[] {345,75,72,88,2,75,45,756,187,73,724,952,457});
} // end of main ()
}// Quicksort