算法介绍
在上一篇排序算法06:快速排序中,可以知道,快速排序不停的递归切分数组。在有大量的重复元素情况下,这样的切分存在巨大的改进空间。三向切分的快速排序就是为了提升在有大量重复元素情况下快速排序的性能。
快速排序把数组切分为两部分,分别对应与小于,大于切分元素的数组元素。而三向切分将数组切分为三部分,分别对应小于,等于,大于切分元素的数组元素。
三向切分的快速排序的算法逻辑为:从左到右遍历数组一次,维护一个指针lt使得a[lo..lt-1]中的元素都小于v,一个指针gt使得a[gt+1..hi]中的元素都大于v,一个指针i使得a[gt..i-1]中的元素都等于v,a[i..gt]中的元素都还未确定。
三向切分的示意图:
算法实现
1 | function quick3way(a,lo,hi) { |
三向切分的轨迹:
完整代码
Javascript实现
1 | /** |
Java实现
1 |
|
总结
- 不稳定。
- 原地排序。
- 时间复杂度为介于N到NlogN之间
- 空间复杂度为lgN
- 经测试验证,在存在大量重复元素情况下,三向切分的快速排序的平均排序时间明显快于快速排序
GitHub:https://github.com/AlbertKnag/algs-practice
上一篇:排序算法06:快速排序
下一篇:排序算法08:优先队列与堆排序