标签:style blog http color io 使用 ar java for
发明者:Sir Charles Antony Richard Hoare
基本思想:
以数据a[j]为中心进行分区(Partition),使得a[j]左侧的数据都小于等于a[j],a[j]右侧的数据都大于等于a[j]
演示(Quicksort partitioning demo)
重复操作指导i和j指针相遇
当指针相遇时
Java实现
public class Quick { private static int partition(Comparable[] a, int lo, int hi) { int i = lo, j = hi + 1; while (true) { while (less(a[++i], a[lo])) if (i == hi) break; // 从左向右找到不小于a[lo]的元素 while (less(a[lo], a[--j])) if (j == lo) break; // 从右向左找到不大于a[lo]的元素 if (i >= j) break; // 指针相遇 exch(a, i , j); // 交换 } exch(a, lo, j); // 和比较元素交换 return j; // 返回比较元素所在的下标 } public static void sort(Comparable[] a) { StdRandom.shuffle(a); // 先对数组进行洗牌,复杂度是N sort(a, 0, a.length - 1); } 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); sort(a, j+1, hi); } }
实现细节(implementation details)
复杂度平均情况分析(average-case analysis):平均复杂度为 1.39NlgN,比归并排序还快
运行特征(Performance characteristic)
特性(Properties):
实践上的改善(practical improvements)
改善1:使用插入排序对小的子序列进行排序
private static void sort(Comparable[] a, int lo, int hi) { if (hi <= lo + CUFOFF -1) { Insertion.sort(a, lo, hi); return; } int j = partition(a, lo, hi); sort(a, lo, j-1); sort(a, j+1, hi); }
改善2:使用平均数作为比较元素
private static void sort(Comparable[] a, int lo, int hi) { if (hi <= lo) return; int m = medianOF3(a, lo, lo + (hi - lo)/2, hi); swap(a, lo, m); int j = partition(a, lo, hi); sort(a, lo, j-1); sort(a, j+1, hi); }
普林斯顿大学算法课 Algorithm Part I Week 3 快速排序 Quicksort
标签:style blog http color io 使用 ar java for
原文地址:http://www.cnblogs.com/Jimtastic/p/4003877.html