日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Java雙軸快速排序算法

瀏覽:220日期:2022-08-10 14:02:40
目錄一、前言二、回顧單軸快排三、雙軸快排分析3.1、總體情況分析3.2、k交換過程3.3、收尾工作四、雙軸快排代碼一、前言

首選,雙軸快排也是一種快排的優化方案,在JDK的Arrays.sort()中被主要使用。所以,掌握快排已經不能夠滿足我們的需求,我們還要學會雙軸快排的原理和實現才行。

二、回顧單軸快排

單軸快排也就是我們常說的普通快速排序,對于快速排序我想大家應該都很熟悉:基于遞歸和分治的,時間復雜度最壞而O(n2),最好和平均情況為O(nlogn).

而快排的具體思路也很簡單,每次在待排序序列中找一個數(通常最左側多一點),然后在這個序列中將比他小的放它左側,比它大的放它右側。

詳解Java雙軸快速排序算法

如果運氣肯不好遇到O(n)平方的,那確實就很被啦:

詳解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<high)//這一輪要求把左側小于a[low],右側大于a[low]。 { while(low<high&&a[high]>=k)//右側找到第一個小于k的停止 { high--; } //這樣就找到第一個比它小的了 a[low]=a[high];//放到low位置 while(low<high&&a[low]<=k)//在low往右找到第一個大于k的,放到右側a[high]位置 { low++; } a[high]=a[low]; } a[low]=k;//賦值然后左右遞歸分治求之 quicksort(a, left, low-1); quicksort(a, low+1, right);}三、雙軸快排分析

咱們今天的主題是雙軸快排,雙軸和單軸的區別你也可以知道,多一個軸,前面講了快排很多時候選最左側元素以這個元素為軸將數據劃分為兩個區域,遞歸分治的去進行排序。但單軸很多時候可能會遇到較差的情況就是當前元素可能是最大的或者最小的,這樣子元素就沒有被劃分區間,快排的遞推T(n)=T(n-1)+O(n)從而為O(n2).

雙軸就是選取兩個主元素理想將區間劃為3部分,這樣不僅每次能夠確定元素個數增多為2個,劃分的區間由原來的兩個變成三個,最壞最壞的情況就是左右同大小并且都是最大或者最小,但這樣的概率相比一個最大或者最小還是低很多很多,所以雙軸快排的優化力度還是挺大的。

3.1、總體情況分析

至于雙軸快排具體是如何工作的呢?其實也不難理解,這里通過一系列圖講解雙軸快排的執行流程。

首先在初始的情況我們是選取待排序區間內最左側、最右側的兩個數值作為pivot1和pivot2 .作為兩個軸的存在。同時我們會提前處理數組最左側和最右側的數據會比較將最小的放在左側。所以pivot1<pivot2.

而當前這一輪的最終目標是,比privot1小的在privot1左側,比privot2大的在privot2右側,在privot1和privot2之間的在中間。

詳解Java雙軸快速排序算法

這樣進行一次后遞歸的進行下一次雙軸快排,一直到結束,但是在這個執行過程應該去如何處理分析呢?需要幾個參數呢?

假設知道排序區間[start,end]。數組為arr, pivot1=arr[start],pivot2=arr[end] 還需要三個參數left,right和k。 l left初始為start,[start,left]區域即為小于等于pivot1小的區域(第一個等于)。 right與left對應,初始為end,[right,end]為大于等于pivot2的區域(最后一個等于)。 k初始為start+1,是一個從左往右遍歷的指針,遍歷的數值與pivot1,pivot2比較進行適當交換,當k>=right即可停止。

詳解Java雙軸快速排序算法

3.2、k交換過程

然后你可能會問k遍歷時候究竟怎么去交換?left和right該如何處理呢?不急我帶你慢慢分析,首先K是在left和right中間的,遍歷k的位置和pivot1,pivot2進行比較:

如果arr[k]<pivot1,那么先++left,然后swap(arr,k,left),因為初始在start在這個過程不結束start先不動。然后k++;繼續進行

詳解Java雙軸快速排序算法

而如果arr[k]>pivot2.(區間自行安排即可)有點區別的就是right可能連續的大于arr[k],比如9 3 3 9 7如果我們需要跳過7前面9到3才能正常交換,這和快排的交換思想一致,當然再具體的實現上就是right--到一個合適比arr[k]小的位置。然后swap(arr,k,right)切記此時k不能自加。因為帶交換的那個有可能比pivot1還小要和left交換。

詳解Java雙軸快速排序算法

如果是介于兩者之間,k++即可

3.3、收尾工作

在執行完這一趟即k=right之后,即開始需要將pivot1和pivot2的數值進行交換

swap(arr, start, left);swap(arr, end, right);

詳解Java雙軸快速排序算法

然后三個區間根據編號遞歸執行排序函數即可。

四、雙軸快排代碼

在這里,分享下個人實現雙軸快排的代碼:

import java.util.Arrays;public class 雙軸快排 { public static void main(String[] args) {int a[]= {7,3,5,4,8,5,6,55,4,333,44,7,885,23,6,44};dualPivotQuickSort(a,0,a.length-1);System.out.println(Arrays.toString(a)); } private static void dualPivotQuickSort(int[] arr, int start, int end) {if(start>end)return;//參數不對直接返回if(arr[start]>arr[end]) swap(arr, start, end);int pivot1=arr[start],pivot2=arr[end];//儲存最左側和最右側的值//(start,left]:左側小于等于pivot1 [right,end)大于pivot2int left=start,right=end,k=left+1;while (k<right) { //和左側交換 if(arr[k]<=pivot1) {//需要交換swap(arr, ++left, k++); } else if (arr[k]<=pivot2) {//在中間的情況k++; } else {while (arr[right]>=pivot2) {//如果全部小于直接跳出外層循環 if(right--==k)break ;}if(k>=right)break ;swap(arr, k, right); }}swap(arr, start, left);swap(arr, end, right);dualPivotQuickSort(arr, start, left-1);dualPivotQuickSort(arr, left+1, right-1);dualPivotQuickSort(arr, right+1, end); } static void swap(int arr[],int i,int j) {int team=arr[i];arr[i]=arr[j];arr[j]=team; }}

執行結果為:

詳解Java雙軸快速排序算法

以上就是詳解Java雙軸快速排序算法的詳細內容,更多關于Java 雙軸快速排序算法的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩精品一区二区三区在线观看| 日本成人在线一区| 国产精品亚洲成在人线| 日韩一区二区三免费高清在线观看| 亚洲一区欧美二区| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日本伊人久久| 日韩极品在线观看| 日本午夜免费一区二区| 欧美私人啪啪vps| 国产欧美另类| 久久成人福利| 中文字幕在线官网| 欧美一级精品| 亚洲一区免费| 亚洲1区在线| 国产精品啊啊啊| 成人台湾亚洲精品一区二区| av最新在线| 九一精品国产| 亚洲资源网站| 日本91福利区| 久久久亚洲欧洲日产| 91av亚洲| 亚洲精华国产欧美| 四虎在线精品| 欧美精品第一区| 日韩专区精品| 免费日韩av片| 国产精品一区二区精品视频观看| 精品久久久久久久| 99久久99视频只有精品| 免费久久99精品国产自在现线| 日本不卡视频在线观看| 嫩呦国产一区二区三区av| 三上悠亚国产精品一区二区三区 | 图片区亚洲欧美小说区| 日韩精品一卡二卡三卡四卡无卡| 日韩福利视频网| 精品72久久久久中文字幕| 久久精品亚洲人成影院| 日韩中文字幕麻豆| 欧美国产日韩电影| 日韩国产一区二区| 日韩在线a电影| 精品久久国产一区| 亚洲欧美成人综合| 国产精品黄色片| 婷婷国产精品| 日韩一区二区三区精品| www.51av欧美视频| 乱人伦精品视频在线观看| 欧美日韩一区自拍| 亚洲a在线视频| 日韩精品一区二区三区中文 | 日韩av二区| 久久国产福利| 狠狠久久伊人| 性色av一区二区怡红| 精品视频亚洲| 国产精品毛片在线看| 精品一区av| 久久国产福利| 日韩在线第七页| 日韩 欧美一区二区三区| 日韩av福利| 日本欧美久久久久免费播放网| 亚洲精品88| 欧美日韩一视频区二区| 欧美日韩国产高清| 精品中文在线| 亚洲+小说+欧美+激情+另类| 蜜桃精品在线| 国产精品第十页| 视频一区欧美精品| 成人av三级| 国产精品自在| 久久国产高清| 美女网站视频一区| 国产美女久久| 水蜜桃久久夜色精品一区的特点| 国产一区二区精品久| 亚洲不卡视频| 欧美日韩日本国产亚洲在线| 精品一区视频| 国产日韩欧美三级| 在线看片日韩| 久久久久网站| 精品三级在线| 日韩高清二区| 国产精品女主播一区二区三区| 91偷拍一区二区三区精品| 日本不卡视频在线| 久久国产精品亚洲77777| 久久蜜桃精品| 首页国产精品| 免费一级欧美片在线观看网站| 一区二区电影| 国产视频一区欧美| 国产99久久| 日韩欧美一区二区三区在线视频| 国产精品黄色| 91福利精品在线观看| 日韩专区欧美专区| 亚洲欧美日韩国产| 群体交乱之放荡娇妻一区二区| 麻豆精品在线观看| 国产精品v日韩精品v欧美精品网站 | 国产成人黄色| 免费在线日韩av| 国产精品视频一区二区三区| 日本国产亚洲| 欧美一区免费| 欧美亚洲网站| 日韩va亚洲va欧美va久久| 蜜桃视频一区二区三区| 99久久九九| 四虎884aa成人精品最新| 亚洲va中文在线播放免费| 都市激情国产精品| 都市激情国产精品| 日韩精品诱惑一区?区三区| 日韩av在线播放网址| 国产成人精品免费视| 国产精品13p| 黑人精品一区| 性感美女一区二区在线观看| 久久久久国产精品一区二区| 久久一区二区三区喷水| 国精品一区二区三区| 在线观看免费一区二区| 桃色一区二区| 欧美久久精品一级c片| 亚洲精品123区| 亚洲精选91| 久久精品99久久久| 国产精品1luya在线播放| 久久三级中文| 欧美国产偷国产精品三区| 成人va天堂| 99re国产精品| 亚洲深夜福利在线观看| 91精品视频一区二区| 欧美国产视频| 国产精品字幕| 久久国产成人| 日韩精品1区2区3区| 国产精品网在线观看| 精品视频网站| 国产字幕视频一区二区| 免费视频最近日韩| 18国产精品| 国产在线视频欧美一区| 欧美成人基地| 亚洲字幕久久| 精品一区二区三区中文字幕| 日韩精品看片| 免费久久99精品国产| 欧美日韩夜夜| 国产一区二区亚洲| 欧美日韩一区二区综合| 午夜欧美在线| 日韩av不卡在线观看| 国产美女高潮在线观看| 偷拍欧美精品| 国产丝袜一区| 色天使综合视频| 综合国产在线| 精品国产成人| 国产精品免费看| 麻豆久久久久久| 午夜av一区| 国产精品午夜一区二区三区| 亚洲播播91| 天堂va在线高清一区| 精品视频免费| 亚洲精品国产偷自在线观看| 日韩高清在线不卡| 亚洲精品永久免费视频| 亚洲在线国产日韩欧美| 国产激情综合| 午夜精品婷婷| 国产乱码精品一区二区三区亚洲人| 国产福利片在线观看| 亚洲欧美日韩专区| 捆绑调教美女网站视频一区| 久久一级电影| 国产精品久久久久久av公交车| 亚洲调教视频在线观看| 欧美私人啪啪vps| 亚洲一本视频| 国产探花在线精品一区二区| 免费精品国产的网站免费观看| 国产美女久久| 黄色av一区| 久久久久九九精品影院| 久久国产66| 成人羞羞在线观看网站| 欧美一级二级三级视频| 免费观看不卡av|