JDK的快速排序算法实现DualPivotQuicksort
從JDK7開始采用這種雙Pivot的快速排序算法,這種算法通常會比傳統(tǒng)單Pivot的快排算法效率更高。本文采用JDK8的源碼進行分析。
具體流程如下:
1.需要排序的數(shù)組為a,判斷數(shù)組的長度是否大于286,大于使用歸并排序(merge sort),否則執(zhí)行2。
2.判斷數(shù)組長度是否小于47,小于則采用插入排序,否則執(zhí)行3。
3.采用近似算法計算數(shù)組長度的1/7
4.取出5個點
int e3 = (left + right) >>> 1; // 中位數(shù) int e2 = e3 - seventh; int e1 = e2 - seventh; int e4 = e3 + seventh; int e5 = e4 + seventh;5.將這5個元素進行插入排序
6.選取a[e2],a[e4]分別作為pivot1,pivot2。由于步驟5進行了排序,所以必有pivot1 < pivot2。
7.接下來定義3個指針,分別是less,k,great。先說一下最終結果,less和great將數(shù)組分為3個部分,分別是小于less的,大于less小于great的元素和大于great的元素。
如何達到這個結果呢,初始時,less和great分別指向數(shù)組起始的元素和結束的元素。此時,所有的元素在less和great之間,即待處理的元素。隨著程序的進行,小于less的元素逐步移動到less左邊,大于great的元素移動到great右邊。
另外有一個指針k表示處理到哪個元素了,初始值為less,結束值為great(這里的great是會動態(tài)改變的,但是大于great的元素一定是處理過的)
8.將a[k]分別與pivot1,pivot2比較。如果小于pivot1,則將a[k]與a[less]對調(diào),同時k++。如果大于pivot2,則執(zhí)行9;否則執(zhí)行10。
9.將a[great]分別與pivot1,pivot2比較。如果a[great]大于pivot2,則遞減great,直到大于pivot2的條件不滿足或者k==great。如果a[great]小于pivot1,則將a[great]換到小于less的區(qū)域。如果a[great]大于pivot1,則說明位于中間區(qū)域,將a[great]與a[k]對調(diào)。great–。
10.k++,如果k>great,說明處理完成,則執(zhí)行11,否則繼續(xù)執(zhí)行8;
11.由于前面的操作,還未將pivot1,pivot2這2個元素放對位置,所以還需要將a[less - 1]移動到隊頭,pivot1移動到(less - 1)的位置,將a[great +1]移動到隊尾,pivot2移動到(great +1)的位置。
12.至此,已經(jīng)達到步驟7描述的最終結果,將數(shù)組分為了3個區(qū)域。對較小的區(qū)域和較大的區(qū)域遞歸執(zhí)行步驟2。判斷中間的區(qū)域是否過大,如果是,則執(zhí)行13,否則遞歸執(zhí)行步驟2。
13.將等于pivot1或者pivot2的元素移動到兩邊,然后遞歸執(zhí)行步驟2。
總結
以上是生活随笔為你收集整理的JDK的快速排序算法实现DualPivotQuicksort的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中弹出对话框的方法
- 下一篇: 浅谈最小生成树的算法思路(一)Prim算