最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java排序之冒泡排序的實(shí)現(xiàn)與優(yōu)化

 更新時(shí)間:2022年11月21日 09:21:01   作者:指北君  
冒泡排序是一種簡單的交換排序。之所以叫做冒泡排序,因?yàn)槲覀兛梢园衙總€(gè)元素當(dāng)成一個(gè)小氣泡,根據(jù)氣泡大小,一步一步移動(dòng)到隊(duì)伍的一端,最后形成一定對(duì)的順序。本文將利用Java實(shí)現(xiàn)冒泡排序,并進(jìn)行一定的優(yōu)化,希望對(duì)大家有所幫助

jwt簡介

冒泡排序:(Bubble Sort)是一種簡單的交換排序。之所以叫做冒泡排序,因?yàn)槲覀兛梢园衙總€(gè)元素當(dāng)成一個(gè)小氣泡,根據(jù)氣泡大小,一步一步移動(dòng)到隊(duì)伍的一端,最后形成一定對(duì)的順序。

冒泡排序的原理

我們以一個(gè)隊(duì)伍站隊(duì)為例,教官第一次給隊(duì)員排隊(duì)是無序的,這時(shí)候就需要排隊(duì),按矮到高的順序排列,首先拎出第一第二個(gè)比較,如果第一個(gè)隊(duì)員比第二個(gè)要高,則兩個(gè)交換位置, 高的放到排到第二個(gè)位置,矮的就排到第一個(gè),再把第二個(gè),第三個(gè)比較,把高的排到后面一個(gè)位置,然后以此類推,直至第一輪所有隊(duì)員都比較過一次(記住每次比較都是相鄰的兩個(gè)),這樣就可以把最高的排到最后的位置。

總結(jié)就是: 每一輪都需要從第一位開始進(jìn)行相鄰的兩個(gè)數(shù)的比較,將較大的數(shù)放后面,比較完畢之后向后挪一位繼續(xù)比較下面兩個(gè)相鄰的兩個(gè)數(shù)大小關(guān)系,重復(fù)此步驟,直到最后一個(gè)還沒歸位的數(shù)。

冒泡排序流程圖

我們進(jìn)行分解看看每一步是怎么執(zhí)行的

首先我們給個(gè)無序數(shù)組 [3,14,32,16,53,8] 進(jìn)行升序排序

第一輪:初始值 [3,14,32,16,53,8]

如圖所示,走完第一輪之后,我們得到的結(jié)果就是[3,14,16,32,8,53],此時(shí)已經(jīng)將最大的數(shù)53排到了指定位置,所以冒泡排序每一輪只能確定將一個(gè)數(shù)歸位。即第一趟只能確定將末位上的數(shù)歸位, 第二趟只能將倒數(shù)第 2 位上的數(shù)歸位,依次類推下去

第二輪:初始值 [3,14,16,32,8,53]

第二輪排序結(jié)果[3,14,16,8,32,53]

第三輪:初始值 [3,14,16,8,32,53]

第三輪排序結(jié)果[3,14,8,16,32,53]

第四輪:初始值 [3,14,8,16,32,53]

第四輪排序結(jié)果[3,8,14,16,32,53]

第五輪:初始值 [3,8,14,16,32,53]

第五輪排序結(jié)果[3,8,14,16,32,53] 到這,我們最終排序完成。

Java代碼實(shí)現(xiàn)

?public?static?void?bubbleSort(int[]?array){
?????????for(int?i=0;i<array.length-1;i++){//控制比較輪次,一共?n-1?趟
?????????????int?num?=?0;?//用來記錄比每輪比較的次數(shù)
?????????????for(int?j=0;j<array.length-1;j++){//控制兩個(gè)挨著的元素進(jìn)行比較
?????????????????if(array[j]?>?array[j+1]){
???????????????????//換位
?????????????????????int?temp?=?array[j];
?????????????????????array[j]?=?array[j+1];
?????????????????????array[j+1]?=?temp;
?????????????????}
?????????????????//比較一次,加1
?????????????????num?=num+1;
?
?????????????}
?????????????//結(jié)果輸出
?????????????System.out.print("第"+(i+1)+"輪:[");
?????????????for?(int?a=0;a<array.length;?a++){
?????????????????if(a!=array.length-1)
?????????????????{
?????????????????????System.out.print(array[a]+",");
?????????????????}else{
?????????????????????System.out.print(array[a]+"]");
?????????????????}
?????????????}
?????????????System.out.println(",比較了:"+num+"?次");
?????????}
?????}

輸出結(jié)果

   第1輪結(jié)果:[3,14,16,32,8,53],每輪比較了:5 次
   第2輪結(jié)果:[3,14,16,8,32,53],每輪比較了:5 次
   第3輪結(jié)果:[3,14,8,16,32,53],每輪比較了:5 次
   第4輪結(jié)果:[3,8,14,16,32,53],每輪比較了:5 次
   第5輪結(jié)果:[3,8,14,16,32,53],每輪比較了:5 次

我在每輪比較的時(shí)候定義了一個(gè)num來記錄比較次數(shù),大家可以看到長度為6的數(shù)組比較,比較了5輪,每輪都比較了5次, 但是通過上面拆分的每一輪比較細(xì)節(jié)可以看出,其實(shí)約到后面的比較,有一部分已經(jīng)是排好了,如果某個(gè)數(shù)比他的下一個(gè)位置還小, 就沒有必要和后面已經(jīng)排好的數(shù)據(jù)再做比較,這樣只會(huì)增加程序運(yùn)行壓力。

比如,第四輪,8和14比較,換位之后,16,32,53都已經(jīng)排好了,14再和16比較,不用換位,那16之后的數(shù)據(jù)已經(jīng)在第三輪排好,就沒必要再比較16和32,32和53了。

那我們來對(duì)程序做一個(gè)優(yōu)化,其實(shí)在第一輪把最大的數(shù)字排到最后之后,第二輪就不用再和最后一個(gè)數(shù)字比較,因?yàn)樽畲蟮臄?shù)字已經(jīng)排好,再比較也只能排在最后一位之前了。

優(yōu)化

 我們就在程序內(nèi)層循環(huán)做一個(gè)限制,每輪比較之后,下一輪就比較到array.length-1-i的位置。就是第一輪6位數(shù)都比較完成,最大排在最后,第二輪就比較前五個(gè)數(shù),把前五個(gè)數(shù)中最大的排在第五位。這樣以此類推,就可以減少程序中無用的比較。

優(yōu)化代碼如下:

???public?static?void?bubbleSort(int[]?array){
?????????for(int?i=0;i<array.length-1;i++){//控制比較輪次,一共?n-1?趟
?????????????int?num?=?0;?//用來記錄比每輪比較的次數(shù)
?????????????//每一輪比較一次就排除最后一位,每輪的最后一位一定是這輪最大的,所以-i,
?????????????for(int?j=0;j<array.length-1-i;j++){//控制兩個(gè)挨著的元素進(jìn)行比較
??????????????????//換位
?????????????????????int?temp?=?array[j];
?????????????????????array[j]?=?array[j+1];
?????????????????????array[j+1]?=?temp;
?????????????????}
?????????????????//比較一次,加1
?????????????????num?=num+1;
?
?????????????}
?????????????//結(jié)果輸出
?????????????System.out.print("第"+(i+1)+"輪結(jié)果:[");
?????????????for?(int?a=0;a<array.length;?a++){
?????????????????if(a!=array.length-1)
?????????????????{
?????????????????????System.out.print(array[a]+",");
?????????????????}else{
?????????????????????System.out.print(array[a]+"]");
?????????????????}
?????????????}
?????????????System.out.println(",每輪比較了:"+num+"?次");
?????????}
?????}

我們?cè)賮砜纯唇Y(jié)果:

第1輪結(jié)果:[3,14,16,32,8,53],每輪比較了:5 次
第2輪結(jié)果:[3,14,16,8,32,53],每輪比較了:4 次
第3輪結(jié)果:[3,14,8,16,32,53],每輪比較了:3 次
第4輪結(jié)果:[3,8,14,16,32,53],每輪比較了:2 次
第5輪結(jié)果:[3,8,14,16,32,53],每輪比較了:1 次

由此,我們可以看到,由之前30次比較減少到15次,所以程序壓力會(huì)少很多,程序復(fù)雜度也降低了。由上面結(jié)果可知:6位長度的數(shù)組需要排五輪,每輪次數(shù)減1,那如果由n個(gè)長度的數(shù)組,需要比較多少次呢?

  • 第一輪:6-1
  • 第二輪:6-2
  • 第三輪:6-3
  • 倒數(shù)第二輪:2
  • 倒數(shù)第一輪:1

得出結(jié)果:(n-1)+(n-2)+...+2+1 = n(n-1)/2 =1/2n^2 -1/2n

是一個(gè)等差數(shù)列,按照時(shí)間復(fù)雜度規(guī)則,直接取最高階項(xiàng)并去除常熟系數(shù)等到時(shí)間復(fù)雜度就是 O(n^2)了

到這,我們的冒泡排序就了解完了。

到此這篇關(guān)于Java排序之冒泡排序的實(shí)現(xiàn)與優(yōu)化的文章就介紹到這了,更多相關(guān)Java冒泡排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springBoot2.X配置全局捕獲異常的操作

    springBoot2.X配置全局捕獲異常的操作

    這篇文章主要介紹了springBoot2.X配置全局捕獲異常的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot2.6.x默認(rèn)禁用循環(huán)依賴后的問題解決

    SpringBoot2.6.x默認(rèn)禁用循環(huán)依賴后的問題解決

    由于SpringBoot從底層逐漸引導(dǎo)開發(fā)者書寫規(guī)范的代碼,同時(shí)也是個(gè)憂傷的消息,循環(huán)依賴的應(yīng)用場景實(shí)在是太廣泛了,所以SpringBoot 2.6.x不推薦使用循環(huán)依賴,本文給大家說下SpringBoot2.6.x默認(rèn)禁用循環(huán)依賴后的應(yīng)對(duì)策略,感興趣的朋友一起看看吧
    2022-02-02
  • Java this關(guān)鍵字的使用詳解

    Java this關(guān)鍵字的使用詳解

    this 關(guān)鍵字是 Java 常用的關(guān)鍵字,可用于任何實(shí)例方法內(nèi)指向當(dāng)前對(duì)象,也可指向?qū)ζ湔{(diào)用當(dāng)前方法的對(duì)象,或者在需要當(dāng)前類型對(duì)象引用時(shí)使用
    2021-11-11
  • maven依賴包加載緩慢的原因以及解決方案

    maven依賴包加載緩慢的原因以及解決方案

    這篇文章主要介紹了maven依賴包加載緩慢的原因以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot聲明式事務(wù)的簡單運(yùn)用說明

    SpringBoot聲明式事務(wù)的簡單運(yùn)用說明

    這篇文章主要介紹了SpringBoot聲明式事務(wù)的簡單運(yùn)用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spring如何使用xml創(chuàng)建bean對(duì)象

    Spring如何使用xml創(chuàng)建bean對(duì)象

    這篇文章主要介紹了Spring如何使用xml創(chuàng)建bean對(duì)象,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • idea中如何配置tomcat

    idea中如何配置tomcat

    這篇文章主要介紹了idea中如何配置tomcat問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot返回long,前端接收進(jìn)度丟失,@JsonSerialize不生效問題

    SpringBoot返回long,前端接收進(jìn)度丟失,@JsonSerialize不生效問題

    這篇文章主要介紹了SpringBoot返回long,前端接收進(jìn)度丟失,@JsonSerialize不生效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 詳解MybatisPlus中@Version注解的使用

    詳解MybatisPlus中@Version注解的使用

    在MyBatisPlus中,常常使用@Version實(shí)現(xiàn)樂觀鎖,該注解用于字段上面。本文將通過示例詳細(xì)講解@Version注解的使用,感興趣的可以了解一下
    2022-06-06
  • JVM完全解讀之YGC來龍去脈分析

    JVM完全解讀之YGC來龍去脈分析

    YGC是JVM?GC當(dāng)前最為頻繁的一種GC,一個(gè)高并發(fā)的服務(wù)在運(yùn)行期間,會(huì)進(jìn)行大量的YGC,發(fā)生YGC時(shí),會(huì)進(jìn)行STW,一般時(shí)間都很短,除非碰到Y(jié)GC時(shí),存在大量的存活對(duì)象需要進(jìn)行拷貝
    2022-01-01

最新評(píng)論

祁连县| 长丰县| 额敏县| 日喀则市| 新安县| 孝义市| 龙游县| 安阳市| 万山特区| 博乐市| 茂名市| 兰溪市| 华亭县| 茶陵县| 抚松县| 陆河县| 丹寨县| 怀集县| 德庆县| 瑞昌市| 綦江县| 松桃| 宿州市| 潮安县| 墨竹工卡县| 清丰县| 乐山市| 鲁山县| 沁水县| 五家渠市| 榆林市| 禹城市| 十堰市| 浙江省| 南投市| 高清| 哈巴河县| 房产| 靖江市| 贺兰县| 黑水县|