1. 程式人生 > >「排序演算法」圖解雙軸快排

「排序演算法」圖解雙軸快排

>首發公眾號: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