在快速排序的基础上,将数组切分成三个部分,及大于、等于、小于三个部分,其中大于和小于部分继续递归快速排序,实现如下:
note:
**1. i于lt之间的偏离即为等于部分
2. lt 为左待排序数组上界位置 , gt 为右待排序数组下界位置**
public static void sort(int[]a, int lo, int hi){
if (lo>=hi) return;
int key = a[lo];
int i=lo+1;
int lt=lo;
int gt=hi;
while(gt >= i){
int cmp = compareTo(a[i],key);
if (cmp > 0) exchange(a,gt--,i);
else if(cmp < 0) exchange(a, lt++,i++);
else i++;
}
sort(a,lo,lt-1);
sort(a,gt+1,hi);
}
优点:使对存在大量重复元素数组排序时效率更快
缺点:使用更多次的交换, 但是对于存在重复元素数组的排序效率提升来说可以忽略
三向切分快速排序时间复杂度是线性的,最会情况为无重复元素。 当存在重复元素,性能优于归并排序较多,且信息量最优。
信息量最优:对于任意分布的输入,最优的基于比较的算法平均所需的比较次数和三向切分的快速排序平均所需比较次数相互处于常数因子范围之内
此性质很重要,对于包含大量重复元素的数组,它将排序时间从线性对数降到了线性级别