Java集合(14)--双枢轴快速排序(DualPivotQuicksort)

JDK1.7  java.uti.Arrays开始使用DualPivotQuicksort作为默认排序方法

详细讲解链接:http://www.tuicool.com/articles/BfY7Nz

算法思想:

选出两个枢轴P1和P2,需要3个指针L,K,G

3个指针的作用如下图:

Java集合(14)--双枢轴快速排序(DualPivotQuicksort)

算法为以下的步骤:(数组大小小于286时,使用DualPivotQuicksort

1、 小于47的数组,使用插入排序。

2、选择枢轴P1和P2。(假设使用数组头和尾)。

3、P1需要小于P2,否者交换。

现在数组被分成4份,left到L的小于P1的数,L到K的大于P1小于P2的数,G到rigth的大于P2的数,待处理的K到G的中间的数(逐步被处理到前3个区域中)。

//关键算法部分

4、L从开始初始化直至不小于P1,K初始化为L-1,G从结尾初始化直至不大于P2。K是主移动的指针,来一步一步吞噬中间区域。

****当大于P1小于P2,K++。

****当小于P1,交换L和K的数,L++,K++。

****当大于P2,如果G的数小于P1,把L上的数放在K上,把G的数放在L上,L++,再把K以前的数放在G上,G--,K++,完成一次L,K,G的互相交换。否则交换K和G,并G--,K++。

5、递归4。

6、交换P1到L-1上。交换P2到G+1上。

7、递归之。

流程图:

Java集合(14)--双枢轴快速排序(DualPivotQuicksort)