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

徹底搞定堆排序:二叉堆

 更新時(shí)間:2021年07月09日 16:59:22   作者:程序dunk  
二叉堆有兩種:最大堆和最小堆。最大堆:父結(jié)點(diǎn)的鍵值總是大于或等于任何一個(gè)子節(jié)點(diǎn)的鍵值;最小堆:父結(jié)點(diǎn)的鍵值總是小于或等于任何一個(gè)子節(jié)點(diǎn)的鍵值

二叉堆

什么是二叉堆

二叉堆本質(zhì)上是一種完全二叉樹,它分為兩個(gè)類型

  • 最大堆:最大堆的任何一個(gè)父節(jié)點(diǎn)的值,都大于等于它的左、右孩子節(jié)點(diǎn)的值(堆頂就是整個(gè)堆的最大元素)
  • 最小堆:最小堆的任何一個(gè)父節(jié)點(diǎn)的值,都小于等于它的左、右孩子節(jié)點(diǎn)的值(堆頂就是整個(gè)堆的最小元素)

二叉堆的根節(jié)點(diǎn)叫做堆頂

二叉堆的基本操作

  • 插入節(jié)點(diǎn)
  • 刪除節(jié)點(diǎn)
  • 構(gòu)建二叉堆

這幾種操作都基于堆的自我調(diào)整,所謂堆自我調(diào)整,就是把一個(gè)不符合堆的完全二叉樹,調(diào)整成一個(gè)堆,下面以最小堆為例。

插入

插入節(jié)點(diǎn)0的過程

image-20210520234450846

刪除

刪除節(jié)點(diǎn)的過程和插入的過程剛好相反,所刪除的是處于堆頂?shù)墓?jié)點(diǎn)。例如刪除1

  • 為了維持完全二叉樹的結(jié)構(gòu),把堆的最后一個(gè)元素臨時(shí)補(bǔ)充到堆頂
  • 刪除原來10的位置
  • 對(duì)堆頂?shù)墓?jié)點(diǎn)10執(zhí)行下沉操作

image-20210521090813943

構(gòu)建

構(gòu)建二叉堆,也就是把一個(gè)無序的完全二叉樹調(diào)整為二叉堆,本質(zhì)就是讓所有的非葉子節(jié)點(diǎn)一次下沉

image-20210521091253667

image-20210521091322240

二叉堆代碼實(shí)現(xiàn)

二查堆雖然是一顆完全二叉樹,但它的存儲(chǔ)方式并不是鏈?zhǔn)降模琼樞虼鎯?chǔ),換句話說,二叉堆的所有節(jié)點(diǎn)都存儲(chǔ)在數(shù)組中

image-20210521092645498

當(dāng)父節(jié)點(diǎn)為parent時(shí),左孩子為2 * parent + 1;右孩子為2 * parent + 2

/**
 * @author :zsy
 * @date :Created 2021/5/17 9:41
 * @description:二叉堆
 */
public class HeapTest {
    public static void main(String[] args) {
        int[] arr = {1, 3, 2, 6, 5, 7, 8, 9, 10, 0};
        Heap heap = new Heap(arr);
        heap.upAdjust(arr);
        System.out.println(Arrays.toString(arr));
        arr = new int[]{7, 1, 3, 10, 5, 2, 8, 9, 6};
        heap = new Heap(arr);
        heap.buildHead();
        System.out.println(Arrays.toString(arr));
    }
}
class Heap {
    private int[] arr;
    public Heap(int[] arr) {
        this.arr = arr;
    }
    public void buildHead() {
        //從最后一個(gè)非葉子節(jié)點(diǎn)開始,依次下沉
        for (int i = (arr.length - 2) / 2; i >= 0; i--) {
            downAdjust(arr, i, arr.length);
        }
    }
    private void downAdjust(int[] arr, int parentIndex, int length) {
        int temp = arr[parentIndex];
        int childrenIndex = parentIndex * 2 + 1;
        while (childrenIndex < length) {
            //如果有右孩子,并且右孩子小于左孩子,那么定位到右孩子
            if (childrenIndex + 1 < length && arr[childrenIndex + 1] < arr[childrenIndex]) {
                childrenIndex++;
            }
            //如果父節(jié)點(diǎn)小于較小孩子節(jié)點(diǎn)的值,直接跳出
            if (temp <= arr[childrenIndex]) break;
            //無需交換,單向賦值
            arr[parentIndex] = arr[childrenIndex];
            parentIndex = childrenIndex;
            childrenIndex = 2 * childrenIndex + 1;
        }
        arr[parentIndex] = temp;
    }
    public void upAdjust(int[] arr) {
        int childrenIndex = arr.length - 1;
        int parentIndex = (childrenIndex - 1) / 2;
        int temp = arr[childrenIndex];
        while (childrenIndex > 0 && temp < arr[parentIndex]) {
            //單向賦值
            arr[childrenIndex] = arr[parentIndex];
            childrenIndex = parentIndex;
            parentIndex = (parentIndex - 1) / 2;
        }
        arr[childrenIndex] = temp;
    }
}

結(jié)果:

[0, 1, 2, 6, 3, 7, 8, 9, 10, 5]
[1, 5, 2, 6, 7, 3, 8, 9, 10]

總結(jié)

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

相關(guān)文章

  • Java中的synchronized關(guān)鍵字

    Java中的synchronized關(guān)鍵字

    這篇文章主要介紹了Java中的synchronized關(guān)鍵字,synchronized可以保證方法或代碼塊在運(yùn)行時(shí),同一時(shí)刻只有一個(gè)線程可以進(jìn)入到臨界區(qū)(互斥性),同時(shí)它還保證了共享變量的內(nèi)存可見性,下面我們就來看看你文章對(duì)synchronized鎖的介紹,需要的朋友也可以參考一下
    2021-12-12
  • Java類加載之Class對(duì)象到Klass模型詳解

    Java類加載之Class對(duì)象到Klass模型詳解

    這篇文章主要介紹了Java類加載之Class對(duì)象到Klass模型詳解,每一個(gè)Java類在JVM中都會(huì)對(duì)應(yīng)創(chuàng)建一個(gè)C++類實(shí)例,我們稱這個(gè)C++類為Klass實(shí)例,Klass實(shí)例里面存儲(chǔ)了java類中所描述的方法、字段、屬性等,需要的朋友可以參考下
    2023-08-08
  • MyBatis配置與CRUD超詳細(xì)講解

    MyBatis配置與CRUD超詳細(xì)講解

    這篇文章主要介紹了MyBatis配置與CRUD,CRUD是指在做計(jì)算處理時(shí)的增加(Create)、讀取(Read)、更新(Update)和刪除(Delete)幾個(gè)單詞的首字母簡寫。CRUD主要被用在描述軟件系統(tǒng)中數(shù)據(jù)庫或者持久層的基本操作功能
    2023-02-02
  • 深入探討Java超時(shí)自動(dòng)取消的實(shí)現(xiàn)方案

    深入探討Java超時(shí)自動(dòng)取消的實(shí)現(xiàn)方案

    在復(fù)雜的分布式系統(tǒng)中,超時(shí)控制是保障系統(tǒng)穩(wěn)定性和可用性的關(guān)鍵機(jī)制,本文將深入探討Java中實(shí)現(xiàn)超時(shí)自動(dòng)取消的多種方案,希望對(duì)大家有所幫助
    2024-11-11
  • HashMap和HashTable底層原理以及常見面試題

    HashMap和HashTable底層原理以及常見面試題

    今天小編就為大家分享一篇關(guān)于HashMap和HashTable底層原理以及常見面試題,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 利用Java編寫個(gè)"不貪吃蛇"小游戲

    利用Java編寫個(gè)"不貪吃蛇"小游戲

    貪吃蛇大家一定有玩過了吧,今天小編給大家?guī)睃c(diǎn)不一樣的。本文將用Java編寫一個(gè)"不貪吃蛇"小游戲,感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-08-08
  • Java的Servlet及其生命周期詳解

    Java的Servlet及其生命周期詳解

    這篇文章主要介紹了Java的Servlet及其生命周期詳解,Servlet是用Java編寫的服務(wù)器端程序,一門用于開發(fā)動(dòng)態(tài)web資源的技術(shù),其主要功能在與交互式的瀏覽和修改數(shù)據(jù),生成動(dòng)態(tài)web內(nèi)容,需要的朋友可以參考下
    2023-11-11
  • Java程序的邏輯控制和方法詳解

    Java程序的邏輯控制和方法詳解

    這篇文章主要介紹了Java程序的邏輯控制和方法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Java實(shí)現(xiàn)簡單的遞歸操作方法實(shí)例

    Java實(shí)現(xiàn)簡單的遞歸操作方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)簡單的遞歸操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java面向?qū)ο髮?shí)現(xiàn)汽車租賃系統(tǒng)

    Java面向?qū)ο髮?shí)現(xiàn)汽車租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java面向?qū)ο髮?shí)現(xiàn)汽車租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評(píng)論

永吉县| 南京市| 雅安市| 乌拉特后旗| 长海县| 郎溪县| 思茅市| 张掖市| 普兰店市| 丽水市| 延川县| 行唐县| 丹阳市| 苍南县| 滕州市| 通州市| 望江县| 运城市| 科尔| 镇赉县| 遵化市| 长武县| 新源县| 乌兰县| 且末县| 称多县| 枣阳市| 东港市| 疏勒县| 固始县| 藁城市| 东安县| 来安县| 和静县| 常德市| 宁武县| 新丰县| 广平县| 西林县| 宁晋县| 宜春市|