日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK的快速排序算法实现DualPivotQuicksort

發(fā)布時間:2024/2/28 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK的快速排序算法实现DualPivotQuicksort 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

從JDK7開始采用這種雙Pivot的快速排序算法,這種算法通常會比傳統(tǒng)單Pivot的快排算法效率更高。本文采用JDK8的源碼進行分析。
具體流程如下:
1.需要排序的數(shù)組為a,判斷數(shù)組的長度是否大于286,大于使用歸并排序(merge sort),否則執(zhí)行2。
2.判斷數(shù)組長度是否小于47,小于則采用插入排序,否則執(zhí)行3。
3.采用近似算法計算數(shù)組長度的1/7

int seventh = (length >> 3) + (length >> 6) + 1;

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。