欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2022年11月21日 09:21:01   作者:指北君  
冒泡排序是一種簡單的交換排序。之所以叫做冒泡排序,因為我們可以把每個元素當成一個小氣泡,根據(jù)氣泡大小,一步一步移動到隊伍的一端,最后形成一定對的順序。本文將利用Java實現(xiàn)冒泡排序,并進行一定的優(yōu)化,希望對大家有所幫助

jwt簡介

冒泡排序:(Bubble Sort)是一種簡單的交換排序。之所以叫做冒泡排序,因為我們可以把每個元素當成一個小氣泡,根據(jù)氣泡大小,一步一步移動到隊伍的一端,最后形成一定對的順序。

冒泡排序的原理

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

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

冒泡排序流程圖

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

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

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

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

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

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

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

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

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

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

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

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

Java代碼實現(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++){//控制兩個挨著的元素進行比較
?????????????????if(array[j]?>?array[j+1]){
???????????????????//換位
?????????????????????int?temp?=?array[j];
?????????????????????array[j]?=?array[j+1];
?????????????????????array[j+1]?=?temp;
?????????????????}
?????????????????//比較一次,加1
?????????????????num?=num+1;
?
?????????????}
?????????????//結果輸出
?????????????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+"?次");
?????????}
?????}

輸出結果

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

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

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

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

優(yōu)化

 我們就在程序內(nèi)層循環(huán)做一個限制,每輪比較之后,下一輪就比較到array.length-1-i的位置。就是第一輪6位數(shù)都比較完成,最大排在最后,第二輪就比較前五個數(shù),把前五個數(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++){//控制兩個挨著的元素進行比較
??????????????????//換位
?????????????????????int?temp?=?array[j];
?????????????????????array[j]?=?array[j+1];
?????????????????????array[j+1]?=?temp;
?????????????????}
?????????????????//比較一次,加1
?????????????????num?=num+1;
?
?????????????}
?????????????//結果輸出
?????????????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+"?次");
?????????}
?????}

我們再來看看結果:

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

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

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

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

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

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

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

相關文章

  • 如何定位java程序中占用cpu最高的線程堆棧信息

    如何定位java程序中占用cpu最高的線程堆棧信息

    這篇文章主要介紹了如何定位java程序中占用cpu最高的線程堆棧信息方法的相關資料,需要的朋友可以參考下
    2022-11-11
  • Java redis使用場景介紹

    Java redis使用場景介紹

    Redis是一個完全開源、遵守 BSD 協(xié)議、簡單的、高效的、分布式的、基于內(nèi)存的k-v數(shù)據(jù)庫,本篇文章帶你了解它的使用場景,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Java中的日期和時間類以及Calendar類用法詳解

    Java中的日期和時間類以及Calendar類用法詳解

    這篇文章主要介紹了Java中的日期和時間類以及Calendar類用法詳解,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • 利用Java和c語言寫一個計算器

    利用Java和c語言寫一個計算器

    這篇文章我們就來分享如何利用Java和c語言來寫一個計算器,文章附有代碼詳細說明,感興趣得小伙伴可以參考下面文章得具體內(nèi)容
    2021-10-10
  • MyBatis批量插入的五種方式小結(MyBatis以集合方式批量新增)

    MyBatis批量插入的五種方式小結(MyBatis以集合方式批量新增)

    本文主要介紹了MyBatis批量插入的五種方式小結(MyBatis以集合方式批量新增),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Spring MVC Locale 本地化示例詳解

    Spring MVC Locale 本地化示例詳解

    這篇文章主要為大家介紹了Spring MVC Locale本地化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Spring?Cache+Redis緩存數(shù)據(jù)的實現(xiàn)示例

    Spring?Cache+Redis緩存數(shù)據(jù)的實現(xiàn)示例

    本文主要介紹了Spring?Cache+Redis緩存數(shù)據(jù),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • JAVA反射機制實例教程

    JAVA反射機制實例教程

    這篇文章主要介紹了JAVA反射機制,包括了Java反射機制的各種應用技巧,非常具有實用價值,需要的朋友可以參考下
    2014-09-09
  • Java集合類中文介紹

    Java集合類中文介紹

    本文首先對Java集合類框架做了簡單說明,之后對主要類和為API做了介紹:Collection、List、Set、AbstractCollection、AbstractList、AbstractSet、Iterator、ListIterator。
    2013-11-11
  • Java判斷對象是否為空的四種方法小結

    Java判斷對象是否為空的四種方法小結

    這篇文章主要介紹了Java判斷對象是否為空的四種方法,判斷對象是否為空有多種方法,包括使用==或!=運算符直接比較對象與null,使用Objects.isNull()方法,以及用instanceof運算符或Optional類進行更安全的空值處理,需要的朋友可以參考下
    2024-10-10

最新評論