「排序演算法」圖解雙軸快排
阿新 • • 發佈:2020-11-05
>首發公眾號:bigsai 轉載需註明公眾號和出處。
## 前言
在排序演算法中,快排是佔比非常多的一環,但是快排其思想一直被考察研究,也有很多的優化方案。這裡主要講解雙軸快排的思想和實現。
首選,雙軸快排也是一種快排的優化方案,在JDK的Arrays.sort()中被主要使用。所以,掌握快排已經不能夠滿足我們的需求,我們還要學會雙軸快排的原理和實現才行。
## 回顧單軸快排
單軸快排也就是我們常說的普通快速排序,對於快速排序我想大家應該都很熟悉:基於遞迴和分治的,時間複雜度最壞而O(n2),最好和平均情況為O(nlogn).
而快排的具體思路也很簡單,每次在待排序序列中找一個數(通常最左側多一點),然後在這個序列中將比他小的放它左側,比它大的放它右側。
![image-20201104195402101](https://bigsai.oss-cn-shanghai.aliyuncs.com/img/image-20201104195402101.png)
如果運氣肯不好遇到O(n)平方的,那確實就很被啦:
![image-20201104200411750](https://bigsai.oss-cn-shanghai.aliyuncs.com/img/image-20201104200411750.png)
實現起來也很容易,這裡直接貼程式碼啦:
```java
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