quicksort将a[low..high]分为a[low..j-1],a[j],a[j+1,high]。
quicksort3way将a[low..high]分为a[low..lt-1],a[lt..gt],a[gt+1..high]。
import java.util.Arrays;
import java.util.Random;
import java.util.stream.Stream;
/**
* Created by fhqplzj on 16-7-17 at 下午12:20.
*/
public class Quick {
private static void exchange(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
private static int partition(int[] a, int low, int high) {
int pivot = a[low];
int i = low, j = high + 1;
while (true) {
while (a[++i] < pivot)
if (i == high)
break;
while (a[--j] > pivot)
if (j == low)
break;
if (i >= j)
break;
exchange(a, i, j);
}
exchange(a, low, j);
return j;
}
private static void sort(int[] a, int low, int high) {
if (low >= high)
return;
int j = partition(a, low, high);
sort(a, low, j - 1);
sort(a, j + 1, high);
}
public static void sort(int[] a) {
sort(a, 0, a.length - 1);
}
private static void quick3way(int[] a, int low, int high) {
if (low >= high)
return;
int lt = low, i = low + 1, gt = high;
int pivot = a[low];
while (i <= gt) {
int cmp = a[i] - pivot;
if (cmp < 0) {
exchange(a, lt++, i++);
} else if (cmp > 0) {
exchange(a, i, gt--);
} else {
i++;
}
}
quick3way(a, low, lt - 1);
quick3way(a, gt + 1, high);
}
public static void quick3way(int[] a) {
quick3way(a, 0, a.length - 1);
}
public static void main(String[] args) {
Random random = new Random(System.nanoTime());
int[] array = Stream.generate(() -> random.nextInt(10)).limit(30).mapToInt(Integer::intValue).toArray();
System.out.println(Arrays.toString(array));
// sort(array);
quick3way(array);
System.out.println(Arrays.toString(array));
}
}