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

Java實現(xiàn)堆排序和圖解

 更新時間:2021年07月09日 08:49:35   作者:程序dunk  
如果將堆理解為二叉樹,那么樹中任一非葉結(jié)點的關(guān)鍵字均不大于(或不小于)其左右孩子(若存在)結(jié)點的關(guān)鍵字,堆排序的時間復(fù)雜度為O(N*logN),這里我們就來詳解堆排序算法原理及Java版的代碼實現(xiàn)

堆排序基本介紹

1、堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)而設(shè)計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復(fù)雜度均為O(nlogn),它也是不穩(wěn)定排序。

2、堆是具有以下性質(zhì)的完全二叉樹:每個結(jié)點的值都大于或等于其左右孩子結(jié)點的值,稱為大頂堆, 注意 : 沒有要求結(jié)點的左孩子的值和右孩子的值的大小關(guān)系。

3、每個結(jié)點的值都小于或等于其左右孩子結(jié)點的值,稱為小頂堆

4、大頂堆舉例說明

大頂堆特點:arr[i] >= arr[2*i+1] && arr[i] >= arr[2*i+2] // i 對應(yīng)第幾個節(jié)點,i從0開始編號

5、小頂堆舉例說明

小頂堆:arr[i] <= arr[2*i+1] && arr[i] <= arr[2*i+2] // i 對應(yīng)第幾個節(jié)點,i從0開始編號

6、一般升序采用大頂堆,降序采用小頂堆

堆排序基本思想

1、將待排序序列構(gòu)造成一個大頂堆

2、此時,整個序列的最大值就是堆頂?shù)母?jié)點。

3、將其與末尾元素進(jìn)行交換,此時末尾就為最大值。

4、然后將剩余n-1個元素重新構(gòu)造成一個堆,這樣會得到n個元素的次小值。如此反復(fù)執(zhí)行,便能得到一個有序序列了。

可以看到在構(gòu)建大頂堆的過程中,元素的個數(shù)逐漸減少,最后就得到一個有序序列了.

堆排序圖解

步驟一

構(gòu)造初始堆。將給定無序序列構(gòu)造成一個大頂堆

1、假設(shè)給定無序序列結(jié)構(gòu)如下

2、此時我們從最后一個非葉子結(jié)點開始(葉結(jié)點自然不用調(diào)整,第一個非葉子結(jié)點 arr.length/2-1=5/2-1=1,也就是下面的6結(jié)點),從左至右,從下至上進(jìn)行調(diào)整。

3、找到第二個非葉節(jié)點4,由于[4,9,8]中9元素最大,4和9交換

4、這時,交換導(dǎo)致了子根[4,5,6]結(jié)構(gòu)混亂,繼續(xù)調(diào)整,[4,5,6]中6最大,交換4和6。

此時,我們就將一個無序序列構(gòu)造成了一個大頂堆。

步驟二

將堆頂元素與末尾元素進(jìn)行交換,使末尾元素最大。然后繼續(xù)調(diào)整堆,再將堆頂元素與末尾元素交換,得到第二大元素。如此反復(fù)進(jìn)行交換、重建、交換。

1、將堆頂元素9和末尾元素4進(jìn)行交換

2、重新調(diào)整結(jié)構(gòu),使其繼續(xù)滿足堆定義

3、再將堆頂元素8與末尾元素5進(jìn)行交換,得到第二大元素8.

4、后續(xù)過程,繼續(xù)進(jìn)行調(diào)整,交換,如此反復(fù)進(jìn)行,最終使得整個序列有序

代碼實現(xiàn)

      public static void headSort(int[] arr){
        //構(gòu)建初始堆,將給定無序序列構(gòu)造成一個大頂堆
        for (int i = arr.length / 2 - 1; i >= 0; i--) {
            adjust(arr,i,arr.length);
        }
        //將堆頂元素與末尾元素進(jìn)行交換,使末尾元素最大,然后繼續(xù)調(diào)整堆
        for (int i = arr.length - 1; i > 0; i--) {
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            adjust(arr,0,i);
        }
    }
    /**
     *
     * @param arr 待排序數(shù)組
     * @param i 最后一個非葉子節(jié)點
     * @param length
     */
    public static void adjust(int[] arr,int i,int length){
        int temp = arr[i];
        for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
            if((k + 1) < length && arr[k] < arr[k + 1])
                k++;
            if(arr[k] > temp){
                arr[i] = arr[k];
                i = k;
            }else
                break;
        }
        arr[i] = temp;
    }

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 快速入門Java中的Lambda表達(dá)式

    快速入門Java中的Lambda表達(dá)式

    Lambda作為函數(shù)式編程中的基礎(chǔ)部分,在其他編程語言中早就廣為使用,但在Java領(lǐng)域中發(fā)展較慢,直到j(luò)ava8,才開始支持Lambda。網(wǎng)上關(guān)于Lambda的教程很多,今天小編給大家分享一篇快速入手Lambda的教程。
    2016-08-08
  • Java?synchronized關(guān)鍵字性能考量及優(yōu)化探索

    Java?synchronized關(guān)鍵字性能考量及優(yōu)化探索

    這篇文章主要為大家介紹了Java?synchronized關(guān)鍵字性能考量及優(yōu)化探索示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java關(guān)于數(shù)組的介紹與使用

    Java關(guān)于數(shù)組的介紹與使用

    數(shù)組(Array)是有序的元素序列。 若將有限個類型相同的變量的集合命名,那么這個名稱為數(shù)組名。組成數(shù)組的各個變量稱為數(shù)組的分量,也稱為數(shù)組的元素,有時也稱為下標(biāo)變量
    2021-09-09
  • java編譯器和JVM的區(qū)別

    java編譯器和JVM的區(qū)別

    在本篇文章里小編給大家整理的是一篇關(guān)于java編譯器和JVM的區(qū)別的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • java代碼關(guān)閉tomcat程序及出現(xiàn)問題解析

    java代碼關(guān)閉tomcat程序及出現(xiàn)問題解析

    這篇文章主要介紹了java代碼關(guān)閉tomcat程序 及出現(xiàn)問題解析,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2019-05-05
  • java實現(xiàn)簡單計算器功能

    java實現(xiàn)簡單計算器功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡單計算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • SpringBoot使用Netty實現(xiàn)遠(yuǎn)程調(diào)用的示例

    SpringBoot使用Netty實現(xiàn)遠(yuǎn)程調(diào)用的示例

    這篇文章主要介紹了SpringBoot使用Netty實現(xiàn)遠(yuǎn)程調(diào)用的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • MyBatis-Plus?實體類注解的實現(xiàn)示例

    MyBatis-Plus?實體類注解的實現(xiàn)示例

    MyBatis-Plus作為MyBatis的增強版,提供了一系列實用的注解,如@TableName、@TableId、@TableField等,旨在簡化數(shù)據(jù)庫和Java實體類之間的映射及CRUD操作,通過這些注解,開發(fā)者可以輕松實現(xiàn)表映射、字段映射、邏輯刪除、自動填充和樂觀鎖等功能
    2024-09-09
  • SpringBoot接口調(diào)用之后報404問題的解決方案

    SpringBoot接口調(diào)用之后報404問題的解決方案

    這篇文章主要介紹了SpringBoot接口調(diào)用之后報404問題的解決方案,具有很好的參考價值,希望對大家有所幫助。
    2021-06-06
  • Spring Boot 2.0 設(shè)置網(wǎng)站默認(rèn)首頁的實現(xiàn)代碼

    Spring Boot 2.0 設(shè)置網(wǎng)站默認(rèn)首頁的實現(xiàn)代碼

    這篇文章主要介紹了Spring Boot 2.0 設(shè)置網(wǎng)站默認(rèn)首頁的實現(xiàn)代碼,需要的朋友可以參考下
    2018-04-04

最新評論

大邑县| 渝北区| 太白县| 永兴县| 古丈县| 宾川县| 太康县| 赣榆县| 镇赉县| 辽中县| 山阳县| 中江县| 新建县| 皮山县| 云南省| 和田市| 望城县| 灵石县| 长沙市| 勃利县| 理塘县| 昆山市| 资中县| 武陟县| 哈密市| 平南县| 顺昌县| 永丰县| 西城区| 浦江县| 乌拉特中旗| 五原县| 宽甸| 古交市| 金溪县| 棋牌| 垫江县| 克什克腾旗| 九龙城区| 建始县| 青河县|