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

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

深入理解java中Arrays.sort()的用法

瀏覽:9日期:2022-09-01 16:42:15

Java的Arrays類(lèi)中有一個(gè)sort()方法,該方法是Arrays類(lèi)的靜態(tài)方法,在需要對(duì)數(shù)組進(jìn)行排序時(shí),非常的好用。

但是sort()的參數(shù)有好幾種,基本上是大同小異,下面是以int型數(shù)組為例的Arrays.sort()的典型用法

import java.util.Arrays;import java.util.Comparator;/** * Arrays.sort()排序 */public class SortTest{ public static void main(String []args) { int[] ints=new int[]{2,324,4,57,1}; System.out.println('增序排序后順序'); Arrays.sort(ints); for (int i=0;i<ints.length;i++) { System.out.print(ints[i]+' '); } System.out.println('n減序排序后順序'); //要實(shí)現(xiàn)減序排序,得通過(guò)包裝類(lèi)型數(shù)組,基本類(lèi)型數(shù)組是不行滴 Integer[] integers=new Integer[]{2,324,4,4,6,1}; Arrays.sort(integers, new Comparator<Integer>() { /* * 此處與c++的比較函數(shù)構(gòu)成不一致 * c++返回bool型,而Java返回的為int型 * 當(dāng)返回值>0時(shí) * 進(jìn)行交換,即排序(源碼實(shí)現(xiàn)為兩樞軸快速排序) */ public int compare(Integer o1, Integer o2) {return o2-o1; } public boolean equals(Object obj) {return false; } }); for (Integer integer:integers) { System.out.print(integer+' '); } System.out.println('n對(duì)部分排序后順序'); int[] ints2=new int[]{212,43,2,324,4,4,57,1}; //對(duì)數(shù)組的[2,6)位進(jìn)行排序 Arrays.sort(ints2,2,6); for (int i=0;i<ints2.length;i++) { System.out.print(ints2[i]+' '); } }}

排序結(jié)果如下

增序排序后順序1 2 4 57 324減序排序后順序324 6 4 4 2 1對(duì)部分排序后順序212 43 2 4 4 324 57 1

打開(kāi)Arrays.sort()源碼,還是以int型為例,其他類(lèi)型也是大同小異

public static void sort(int[] a) { DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0); } public static void sort(int[] a, int fromIndex, int toIndex) { rangeCheck(a.length, fromIndex, toIndex); DualPivotQuicksort.sort(a, fromIndex, toIndex - 1, null, 0, 0); }

從源碼中發(fā)現(xiàn),兩種參數(shù)類(lèi)型的sort方法都調(diào)用了 DualPivotQuicksort.sort()方法繼續(xù)跟蹤源碼

static void sort(int[] a, int left, int right, int[] work, int workBase, int workLen) { // Use Quicksort on small arrays if (right - left < QUICKSORT_THRESHOLD) { sort(a, left, right, true); return; } /* * Index run[i] is the start of i-th run * (ascending or descending sequence). */ int[] run = new int[MAX_RUN_COUNT + 1]; int count = 0; run[0] = left; // Check if the array is nearly sorted for (int k = left; k < right; run[count] = k) { if (a[k] < a[k + 1]) { // ascendingwhile (++k <= right && a[k - 1] <= a[k]); } else if (a[k] > a[k + 1]) { // descendingwhile (++k <= right && a[k - 1] >= a[k]);for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) { int t = a[lo]; a[lo] = a[hi]; a[hi] = t;} } else { // equalfor (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) { if (--m == 0) { sort(a, left, right, true); return; }} } /* * The array is not highly structured, * use Quicksort instead of merge sort. */ if (++count == MAX_RUN_COUNT) {sort(a, left, right, true);return; } } // Check special cases // Implementation note: variable 'right' is increased by 1. if (run[count] == right++) { // The last run contains one element run[++count] = right; } else if (count == 1) { // The array is already sorted return; } // Determine alternation base for merge byte odd = 0; for (int n = 1; (n <<= 1) < count; odd ^= 1); // Use or create temporary array b for merging int[] b; // temp array; alternates with a int ao, bo; // array offsets from ’left’ int blen = right - left; // space needed for b if (work == null || workLen < blen || workBase + blen > work.length) { work = new int[blen]; workBase = 0; } if (odd == 0) { System.arraycopy(a, left, work, workBase, blen); b = a; bo = 0; a = work; ao = workBase - left; } else { b = work; ao = 0; bo = workBase - left; } // Merging for (int last; count > 1; count = last) { for (int k = (last = 0) + 2; k <= count; k += 2) {int hi = run[k], mi = run[k - 1];for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) { if (q >= hi || p < mi && a[p + ao] <= a[q + ao]) { b[i + bo] = a[p++ + ao]; } else { b[i + bo] = a[q++ + ao]; }}run[++last] = hi; } if ((count & 1) != 0) {for (int i = right, lo = run[count - 1]; --i >= lo; b[i + bo] = a[i + ao]);run[++last] = right; } int[] t = a; a = b; b = t; int o = ao; ao = bo; bo = o; } }

結(jié)合文檔以及源代碼,我們發(fā)現(xiàn),jdk中的Arrays.sort()的實(shí)現(xiàn)是通過(guò)所謂的雙軸快排的算法

/** * This class implements the Dual-Pivot Quicksort algorithm by * Vladimir Yaroslavskiy, Jon Bentley, and Josh Bloch. The algorithm * offers O(n log(n)) performance on many data sets that cause other * quicksorts to degrade to quadratic performance, and is typically * faster than traditional (one-pivot) Quicksort implementations. * * All exposed methods are package-private, designed to be invoked * from public methods (in class Arrays) after performing any * necessary array bounds checks and expanding parameters into the * required forms. * * @author Vladimir Yaroslavskiy * @author Jon Bentley * @author Josh Bloch * * @version 2011.02.11 m765.827.12i:57pm * @since 1.7 */

Java1.8的快排是一種雙軸快排,顧名思義:雙軸快排是基于兩個(gè)軸來(lái)進(jìn)行比較,跟普通的選擇一個(gè)點(diǎn)來(lái)作為軸點(diǎn)的快排是有很大的區(qū)別的,雙軸排序利用了區(qū)間相鄰的特性,對(duì)原本的快排進(jìn)行了效率上的提高,很大程度上是利用了數(shù)學(xué)的一些特性。。。。。嗯。。。反正很高深的樣子

算法步驟

1.對(duì)于很小的數(shù)組(長(zhǎng)度小于27),會(huì)使用插入排序。2.選擇兩個(gè)點(diǎn)P1,P2作為軸心,比如我們可以使用第一個(gè)元素和最后一個(gè)元素。3.P1必須比P2要小,否則將這兩個(gè)元素交換,現(xiàn)在將整個(gè)數(shù)組分為四部分:(1)第一部分:比P1小的元素。(2)第二部分:比P1大但是比P2小的元素。(3)第三部分:比P2大的元素。(4)第四部分:尚未比較的部分。在開(kāi)始比較前,除了軸點(diǎn),其余元素幾乎都在第四部分,直到比較完之后第四部分沒(méi)有元素。4.從第四部分選出一個(gè)元素a[K],與兩個(gè)軸心比較,然后放到第一二三部分中的一個(gè)。5.移動(dòng)L,K,G指向。6.重復(fù) 4 5 步,直到第四部分沒(méi)有元素。7.將P1與第一部分的最后一個(gè)元素交換。將P2與第三部分的第一個(gè)元素交換。8.遞歸的將第一二三部分排序。

疑問(wèn):為啥不用泛型

到此這篇關(guān)于深入理解java中Arrays.sort()的用法的文章就介紹到這了,更多相關(guān)java Arrays.sort()內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 空冷器|空气冷却器|空水冷却器-无锡赛迪森机械有限公司[官网] | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 不干胶标签,不干胶标签纸_厂家-山东同力胶粘制品 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 智慧食堂_食堂管理系统_食堂订餐_食堂消费系统—客易捷 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 中宏网-今日新闻-财经新闻| Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 内窥镜-工业内窥镜厂家【上海修远仪器仪表有限公司】 | 物流之家新闻网-最新物流新闻|物流资讯|物流政策|物流网-匡匡奈斯物流科技 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 变压器配件,变压器吸湿器,武强县吉口变压器配件有限公司 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 聚合氯化铝厂家-聚合氯化铝铁价格-河南洁康环保科技 | 净化板-洁净板-净化板价格-净化板生产厂家-山东鸿星新材料科技股份有限公司 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 溶氧传感器-pH传感器|哈美顿(hamilton) | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 不锈钢丸厂家,铝丸,铸钢丸-淄博智源铸造材料有限公司 | 大连海岛旅游网>>大连旅游,大连海岛游,旅游景点攻略,海岛旅游官网 | 重庆中专|职高|技校招生-重庆中专招生网 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | 盘古网络技术有限公司| 烟气换热器_GGH烟气换热器_空气预热器_高温气气换热器-青岛康景辉 | 华中线缆有限公司-电缆厂|电缆厂家|电线电缆厂家 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 地源热泵一体机,地源热泵厂家-淄博汇能环保设备有限公司 | 威海防火彩钢板,威海岩棉复合板,威海彩钢瓦-文登区九龙岩棉复合板厂 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 | bkzzy在职研究生网 - 在职研究生招生信息咨询平台 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 |