电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解Java雙軸快速排序算法

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

首選,雙軸快排也是一種快排的優(yōu)化方案,在JDK的Arrays.sort()中被主要使用。所以,掌握快排已經(jīng)不能夠滿足我們的需求,我們還要學(xué)會(huì)雙軸快排的原理和實(shí)現(xiàn)才行。

二、回顧單軸快排

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

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

詳解Java雙軸快速排序算法

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

詳解Java雙軸快速排序算法

實(shí)現(xiàn)起來也很容易,這里直接貼代碼啦:

private static void quicksort(int [] a,int left,int right){ int low=left; int high=right; //下面兩句的順序一定不能混,否則會(huì)產(chǎn)生數(shù)組越界!!!very important!!! if(low>high)//作為判斷是否截止條件 return; int k=a[low];//額外空間k,取最左側(cè)的一個(gè)作為衡量,最后要求左側(cè)都比它小,右側(cè)都比它大。 while(low<high)//這一輪要求把左側(cè)小于a[low],右側(cè)大于a[low]。 { while(low<high&&a[high]>=k)//右側(cè)找到第一個(gè)小于k的停止 { high--; } //這樣就找到第一個(gè)比它小的了 a[low]=a[high];//放到low位置 while(low<high&&a[low]<=k)//在low往右找到第一個(gè)大于k的,放到右側(cè)a[high]位置 { low++; } a[high]=a[low]; } a[low]=k;//賦值然后左右遞歸分治求之 quicksort(a, left, low-1); quicksort(a, low+1, right);}三、雙軸快排分析

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

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

3.1、總體情況分析

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

首先在初始的情況我們是選取待排序區(qū)間內(nèi)最左側(cè)、最右側(cè)的兩個(gè)數(shù)值作為pivot1和pivot2 .作為兩個(gè)軸的存在。同時(shí)我們會(huì)提前處理數(shù)組最左側(cè)和最右側(cè)的數(shù)據(jù)會(huì)比較將最小的放在左側(cè)。所以pivot1<pivot2.

而當(dāng)前這一輪的最終目標(biāo)是,比privot1小的在privot1左側(cè),比privot2大的在privot2右側(cè),在privot1和privot2之間的在中間。

詳解Java雙軸快速排序算法

這樣進(jìn)行一次后遞歸的進(jìn)行下一次雙軸快排,一直到結(jié)束,但是在這個(gè)執(zhí)行過程應(yīng)該去如何處理分析呢?需要幾個(gè)參數(shù)呢?

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

詳解Java雙軸快速排序算法

3.2、k交換過程

然后你可能會(huì)問k遍歷時(shí)候究竟怎么去交換?left和right該如何處理呢?不急我?guī)懵治觯紫菿是在left和right中間的,遍歷k的位置和pivot1,pivot2進(jìn)行比較:

如果arr[k]<pivot1,那么先++left,然后swap(arr,k,left),因?yàn)槌跏荚趕tart在這個(gè)過程不結(jié)束start先不動(dòng)。然后k++;繼續(xù)進(jìn)行

詳解Java雙軸快速排序算法

而如果arr[k]>pivot2.(區(qū)間自行安排即可)有點(diǎn)區(qū)別的就是right可能連續(xù)的大于arr[k],比如9 3 3 9 7如果我們需要跳過7前面9到3才能正常交換,這和快排的交換思想一致,當(dāng)然再具體的實(shí)現(xiàn)上就是right--到一個(gè)合適比arr[k]小的位置。然后swap(arr,k,right)切記此時(shí)k不能自加。因?yàn)閹Ы粨Q的那個(gè)有可能比pivot1還小要和left交換。

詳解Java雙軸快速排序算法

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

3.3、收尾工作

在執(zhí)行完這一趟即k=right之后,即開始需要將pivot1和pivot2的數(shù)值進(jìn)行交換

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

詳解Java雙軸快速排序算法

然后三個(gè)區(qū)間根據(jù)編號(hào)遞歸執(zhí)行排序函數(shù)即可。

四、雙軸快排代碼

在這里,分享下個(gè)人實(shí)現(xiàn)雙軸快排的代碼:

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;//參數(shù)不對(duì)直接返回if(arr[start]>arr[end]) swap(arr, start, end);int pivot1=arr[start],pivot2=arr[end];//儲(chǔ)存最左側(cè)和最右側(cè)的值//(start,left]:左側(cè)小于等于pivot1 [right,end)大于pivot2int left=start,right=end,k=left+1;while (k<right) { //和左側(cè)交換 if(arr[k]<=pivot1) {//需要交換swap(arr, ++left, k++); } else if (arr[k]<=pivot2) {//在中間的情況k++; } else {while (arr[right]>=pivot2) {//如果全部小于直接跳出外層循環(huán) 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; }}

執(zhí)行結(jié)果為:

詳解Java雙軸快速排序算法

以上就是詳解Java雙軸快速排序算法的詳細(xì)內(nèi)容,更多關(guān)于Java 雙軸快速排序算法的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 换网器_自动换网器_液压换网器--郑州海科熔体泵有限公司 | 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | 并离网逆变器_高频UPS电源定制_户用储能光伏逆变器厂家-深圳市索克新能源 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 隧道窑炉,隧道窑炉厂家-山东艾瑶国际贸易 | 维泰克Veertek-锂电池微短路检测_锂电池腐蚀检测_锂电池漏液检测 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 江苏南京多语种翻译-专业翻译公司报价-正规商务翻译机构-南京华彦翻译服务有限公司 | 河南档案架,档案密集架,手动密集架,河南密集架批发/报价 | 原色会计-合肥注册公司_合肥代理记账公司_营业执照代办 | 保健品OEM贴牌代加工厂家_德州健之源| 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 东莞精密模具加工,精密连接器模具零件,自動機零件,冶工具加工-益久精密 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网| 生物除臭剂-除味剂-植物-污水除臭剂厂家-携葵环保有限公司 | 喷漆房_废气处理设备-湖北天地鑫环保设备有限公司 | 网站优化公司_北京网站优化_抖音短视频代运营_抖音关键词seo优化排名-通则达网络 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 广州迈驰新GMP兽药包装机首页_药品包装机_中药散剂包装机 | 汽车水泵_汽车水泵厂家-瑞安市骏迪汽车配件有限公司 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 章丘丰源机械有限公司 - 三叶罗茨风机,罗茨鼓风机,罗茨风机 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 东风体检车厂家_公共卫生体检车_医院体检车_移动体检车-锦沅科贸 | 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | 磁力反应釜,高压釜,实验室反应釜,高温高压反应釜-威海自控反应釜有限公司 | 环氧树脂地坪漆_济宁市新天地漆业有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 |