public class Quick
{
public static void sort(Comparable[] a)
{
StdRandom.shuffle(a); //消除对输入的依赖
sort(a, 0, a.length - 1);
}
private static int partition(Comparable[] a, int lo, int hi)
{ //将数组切分成a[lo..i-1], a[i], a[i+1..hi]
int i = lo, j = hi+1; //左右扫描指针
Comparable v = a[lo]; //切分元素
while (true)
{ //扫描左右,检查扫描是否结束并交换元素
while (less(a[++i], v)) if (i == hi) break;
while (less(v, a[--j])) if (j == lo) break;
if (i >= j) break;
exch(a, i, j);
}
exch(a, lo, j); //将v = a[j]放入正确的位置
return j; //a[lo..j-1] <= a[j] <= a[j+1..hi] 达成
}
private static void sort(Comparable[] a, int lo, int hi)
{
if (hi <= lo) return;
int j = partition(a, lo, hi); //切分
sort(a, lo, j-1); //将左半部分a[lo .. j-1]排序
sort(a, j+1, hi); //将右半部分a[j+1 .. hi]排序
}
}
其中partition()函数保证每个数组的首个元素a[0]在整个数组中的排序位置是正确的,并以此值为界将数组分成两个不包含它的数组在分别进行排序,如此迭代,完成排序。
三向切分的快速排序
在处理含有大量重复元素的数组时,使用三向切分,将数组切分为小于、等于和大于切分元素的三个小数组,可以提高算法的速度。
public class Quick3way
{
public static void sort(Comparable[] a, int lo, int hi)
{
StdRandom.shuffle(a); //消除对输入的依赖
sort(a, 0, a.length - 1);
}
private static void sort(Comparable[] a, int lo, int hi)
{
if (hi <= lo) return;
int lt = lo, i = lo+1, gt = hi;
Comparable v = a[lo];
while (i <= gt)
{
int cmp = a[i].compareTo(v);
if (cmp < 0) exch(a, lt++, i++);
else if (cmp > 0) exch(a, i, gt--);
else i++;
} //现在a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi]成立
sort(a, gt + 1, hi);
}
}
原文:https://www.cnblogs.com/auhz/p/9016783.html