标签:现在 包含 依赖 oid stat shuff div ESS art
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); } }
标签:现在 包含 依赖 oid stat shuff div ESS art
原文地址:https://www.cnblogs.com/auhz/p/9016783.html