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

徹底搞定堆排序:二叉堆

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

二叉堆

什么是二叉堆

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

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

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

二叉堆的基本操作

  • 插入節(jié)點
  • 刪除節(jié)點
  • 構建二叉堆

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

插入

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

image-20210520234450846

刪除

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

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

image-20210521090813943

構建

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

image-20210521091253667

image-20210521091322240

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

二查堆雖然是一顆完全二叉樹,但它的存儲方式并不是鏈式的,而是順序存儲,換句話說,二叉堆的所有節(jié)點都存儲在數(shù)組中

image-20210521092645498

當父節(jié)點為parent時,左孩子為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() {
        //從最后一個非葉子節(jié)點開始,依次下沉
        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é)點小于較小孩子節(jié)點的值,直接跳出
            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é)

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

相關文章

  • Java中的synchronized關鍵字

    Java中的synchronized關鍵字

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

    Java類加載之Class對象到Klass模型詳解

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

    MyBatis配置與CRUD超詳細講解

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

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

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

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

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

    利用Java編寫個"不貪吃蛇"小游戲

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

    Java的Servlet及其生命周期詳解

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

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

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

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

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

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

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

最新評論

临沭县| 个旧市| 金坛市| 界首市| 改则县| 宁河县| 抚州市| 罗田县| 阳江市| 淮滨县| 隆尧县| 延吉市| 建湖县| 开封县| 呈贡县| 柳江县| 莫力| 南皮县| 张北县| 鹿泉市| 育儿| 巴林右旗| 涞源县| 韩城市| 方城县| 炉霍县| 漳浦县| 桃园市| 鲁山县| 高阳县| 城口县| 白城市| 马尔康县| 泉州市| 曲松县| 诸城市| 拜城县| 江北区| 澜沧| 凤冈县| 玉田县|