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

Java最簡潔數(shù)據(jù)結(jié)構(gòu)之冒泡排序快速理解

 更新時(shí)間:2021年11月15日 14:47:20   作者:AXiYa_Ari  
冒泡排序是編程中數(shù)據(jù)結(jié)構(gòu)繞不過的一個(gè)基礎(chǔ)點(diǎn),有關(guān)于冒泡排序的文章也有很多,但可能會(huì)比較繚亂未能理解,本章將一子u為簡潔明了的例圖帶你通關(guān)冒泡排序

一、什么是冒泡排序

冒泡排序的英文是bubble sort,它是一種基礎(chǔ)的交換排序。說到冒泡是不是就想起了快樂肥宅水呢?汽水中有許多小小的水泡嘩啦嘩啦的浮到上面來。這是因?yàn)榻M成小氣泡的二氧化碳比水輕,所以小氣泡可以一點(diǎn)一點(diǎn)地向上浮動(dòng)。

而冒泡排序之所以叫冒泡排序,正是因?yàn)檫@種排序算法的每一個(gè)元素都可以像小氣泡一樣,根據(jù)自身的大小,一點(diǎn)一點(diǎn)的向著數(shù)組的一側(cè)移動(dòng)。

二、圖解冒泡排序

我們先看一個(gè)例子,有七個(gè)數(shù)字組成一個(gè)無序數(shù)列{5,6,3,4,1,7},對(duì)他進(jìn)行冒泡排序。

按照冒泡排序的思想:把相鄰的兩個(gè)數(shù)字兩兩比較,當(dāng)一個(gè)數(shù)字大于右側(cè)相鄰的數(shù)字時(shí),交換他們的位置,當(dāng)一個(gè)數(shù)字和他右側(cè)的數(shù)字小于或等于的時(shí)候,不交換。

這樣,作為數(shù)列中的最大的數(shù)字7就交換到了最右側(cè)。這時(shí)第一輪冒泡結(jié)束。(有效區(qū)域只有最后一個(gè))

根據(jù)第一輪的交換細(xì)節(jié),第二輪到第六輪的狀態(tài)為下圖。

到此為止,所有的數(shù)字都是有序的了,冒泡排序是一種穩(wěn)定排序,由于該排序算法的每一輪都要遍歷所有的數(shù)字,一共要遍歷n-1,所以時(shí)間復(fù)雜度為O(n^2)。

那么我們?nèi)绾螀^(qū)分排序算法是否穩(wěn)定呢?

如果我們交換的時(shí)候,遇到兩個(gè)相同的數(shù)字,如果兩個(gè)相同的數(shù)字在排序之后相對(duì)位置沒有交換,那么就是穩(wěn)定的排序,反之則是不穩(wěn)定的排序。

三、代碼實(shí)現(xiàn)

    public static void bubbleSort(int arr[]){
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j <arr.length-i-1 ; j++) {
                int tmp=0;
                if(arr[j]>arr[j+1]){
                    tmp=arr[j+1];
                    arr[j+1]=arr[j];
                    arr[j]=tmp;
                }
            }
        }
    }
 
    public static void main(String[] args) {
        int[] arr = new int[]{5,6,3,2,4,1,7};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }

四、代碼的優(yōu)化

1、整體的思路

從上面的例子不難看出,我們可以對(duì)原來的冒泡排序進(jìn)行優(yōu)化。我們?nèi)匀挥蒙厦婺貍€(gè)數(shù)列{5,6,3,4,1,7}為例子,從上面的圖解可以看出在第五輪排序后,整個(gè)數(shù)列已經(jīng)是有序的,但是排序算法還是執(zhí)行了第六輪排序。

優(yōu)化的思路是:如果能判斷出數(shù)列已經(jīng)是有序的了,并且做出標(biāo)記,那么就不會(huì)執(zhí)行多余的排序。

所以我們可以用布爾變量isSorted作為標(biāo)記,如果在本輪排序中有元素進(jìn)行交換,則說明數(shù)列無序;如果在本輪排序中,沒有元素進(jìn)行交換,我們則認(rèn)為此時(shí)數(shù)列已經(jīng)為有序的,不需要再去進(jìn)行下一輪的排序。

2、代碼示例

    public static void bubbleSort(int arr[]){
        for (int i = 0; i < arr.length-1; i++) {
            //有序標(biāo)記,每一輪的初始值都是true
            boolean isSorted=true;
            for (int j = 0; j < arr.length-i-1; j++) {
                int tmp=0;
                if (arr[j]>arr[j+1]){
                    tmp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=tmp;
                    //因?yàn)橛性剡M(jìn)行交換,所以不是有序的,標(biāo)記變?yōu)閒alse
                    isSorted=false;
                }
            }
            if (isSorted){
                break;
            }
        }
    }
    public static void main(String[] args) {
        int[] arr = new int[]{5,6,3,2,4,1,7};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }

以上就是Java最簡潔數(shù)據(jù)結(jié)構(gòu)之冒泡排序快速理解的詳細(xì)內(nèi)容,更多關(guān)于Java 冒泡排序的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • WebSocket+Vue+SpringBoot實(shí)現(xiàn)語音通話的使用示例

    WebSocket+Vue+SpringBoot實(shí)現(xiàn)語音通話的使用示例

    本文主要介紹了WebSocket+Vue+SpringBoot實(shí)現(xiàn)語音通話的使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Java設(shè)計(jì)模式之java責(zé)任鏈模式詳解

    Java設(shè)計(jì)模式之java責(zé)任鏈模式詳解

    這篇文章主要介紹了JAVA 責(zé)任鏈模式的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2021-09-09
  • Java結(jié)構(gòu)型模式中的組合模式詳解

    Java結(jié)構(gòu)型模式中的組合模式詳解

    組合模式,又叫部分整體模式,它創(chuàng)建了對(duì)象組的數(shù)據(jù)結(jié)構(gòu)組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的訪問具有一致性。本文將通過示例為大家詳細(xì)介紹一下組合模式,需要的可以參考一下
    2023-02-02
  • 利用Java和c語言寫一個(gè)計(jì)算器

    利用Java和c語言寫一個(gè)計(jì)算器

    這篇文章我們就來分享如何利用Java和c語言來寫一個(gè)計(jì)算器,文章附有代碼詳細(xì)說明,感興趣得小伙伴可以參考下面文章得具體內(nèi)容
    2021-10-10
  • springboot組件初始化后的4種啟動(dòng)方式及常用方法

    springboot組件初始化后的4種啟動(dòng)方式及常用方法

    在Spring Boot中,您可以通過幾種方式在組件初始化后執(zhí)行啟動(dòng)任務(wù),下面小編給大家分享springboot組件初始化后的4種啟動(dòng)方式及常用方法,感興趣的朋友一起看看吧
    2024-06-06
  • Mybatisplus如何存儲(chǔ)List、Map

    Mybatisplus如何存儲(chǔ)List、Map

    這篇文章主要介紹了Mybatisplus如何存儲(chǔ)List、Map問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Spring boot注解@Async線程池實(shí)例詳解

    Spring boot注解@Async線程池實(shí)例詳解

    這篇文章主要介紹了Spring boot注解@Async線程池實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 自定義類加載器的父類為何是AppClassLoader說明

    自定義類加載器的父類為何是AppClassLoader說明

    這篇文章主要介紹了自定義類加載器的父類為何是AppClassLoader說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java圖片添加水印實(shí)例代碼分享

    java圖片添加水印實(shí)例代碼分享

    這篇文章主要為大家詳細(xì)介紹了java圖片添加水印實(shí)例代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 解決常見的Eclipse SVN插件報(bào)錯(cuò)方法詳解

    解決常見的Eclipse SVN插件報(bào)錯(cuò)方法詳解

    本篇文章是對(duì)常見的Eclipse SVN插件報(bào)錯(cuò)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論

洛隆县| 海晏县| 花莲市| 香河县| 永靖县| 渭源县| 长岛县| 长阳| 忻城县| 璧山县| 虎林市| 尼玛县| 砀山县| 射洪县| 手游| 枣庄市| 彝良县| 棋牌| 治县。| 平昌县| 霍城县| 东阳市| 中牟县| 宁明县| 临高县| 炉霍县| 青神县| 崇州市| 长宁县| 仁怀市| 岳池县| 平塘县| 柳江县| 丹江口市| 嘉禾县| 泸州市| 万盛区| 广州市| 临湘市| 博爱县| 雷波县|