前言
在排序算法中,快排是占比非常多的一环,但是快排其思想一直被考察研究,也有很多的优化方案。这里主要讲解双轴快排的思想和实现。
首选,双轴快排也是一种快排的优化方案,在JDK的Arrays.sort()中被主要使用。所以,掌握快排已经不能够满足我们的需求,我们还要学会双轴快排的原理和实现才行。
回顾单轴快排
单轴快排也就是我们常说的普通快速排序,对于快速排序我想大家应该都很熟悉:基于递归和分治的,时间复杂度最坏而O(n2),最好和平均情况为O(nlogn).
而快排的具体思路也很简单,每次在待排序序列中找一个数(通常最左侧多一点),然后在这个序列中将比他小的放它左侧,比它大的放它右侧。
![8520b888b5a901ed278023d94176d6d9.png](https://i-blog.csdnimg.cn/blog_migrate/f729b9353a9e372ce6ccb7fa28f8d07f.jpeg)
如果运气肯不好遇到O(n)平方的,那确实就很被啦:
![64c959b6f543351345f858fbe83b3bce.png](https://i-blog.csdnimg.cn/blog_migrate/954142e94a4a985a9485680a9cac1229.jpeg)
实现起来也很容易,这里直接贴代码啦:
private static void quicksort(int [] a,int left,int right)
{
int low=left;
int high=right;
//下面两句的顺序一定不能混,否则会产生数组越界!!!very important!!!
if(low>high)//作为判断是否截止条件
return;
int k=a[low];//额外空间k,取最左侧的一个作为衡量,最后要求左侧都比它小,右侧都比它大。
while(low<high)//这一轮要求把左侧小于a[low],右侧大于a[low]。
{
while(low<hi