快速排序是应用最广泛的排序算法
优点:
- 原地排序(只需要一个很小的辅助栈)
- 长度为N的数组排序所时间和NlgN成正比
但需要非常小心才能避免低劣的性能。
Quick Sort is a divide-and-conquer method for sorting.
递归调用发生在处理整个数组之后,切分(partition)
的位置取决于数据组的内容。
|
|
切分(portition)需要满足三个条件:
- 对于某个j,a[j]已经排定
- a[lo]到a[j-1]的所有元素都不大于a[j]
- a[j+1]到a[hi]的所有元素都不小于a[j]
快速排序的切分:
具体的思路是:随意地取a[lo]
为切分元素,然后从数组的左端
开始扫描直到找到一个大于等于他的元素,再从右端开始扫描,直到找到一个小于等于他的元素。我们交换
这两个元素的位置。
快速排序的缺点:在切分不平衡
时程序可能会极为低效。
三向切分的快速排序:
应用场景:如果出现有大量重复的数组,这时候就需要用到三向切分的快速排序。
使用Comparable
接口(而非less())对a[i]进行三向比较来直接处理以下三种情况:
- a[i]小于v,将a[lt]和a[i]交换,将lt和i加一;
- a[i]大于v,将a[gt]和a[i]交换,将gt减一;
- a[i]等于v,将i加一;
下面为代码实现:
Exercise
- Write a program Sort2distinct.java that sorts an array that is known to contain just two distinct key values.
- About how many compares will Quick.sort() make when sorting an array of N items that are all equal?
Solution. ~ N lg N compares. Each partition will divide the array in half, plus or minus one. - Show, in the style of the trace given with the code, how the entropy-optimal sort first partitions the array
B A B A B A B A C A D A B R A
.