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

Java代碼為例講解堆的性質(zhì)和基本操作以及排序方法

 更新時(shí)間:2016年06月08日 12:01:34   作者:林壽山  
堆數(shù)據(jù)結(jié)構(gòu)可以看作一顆完全二叉樹,因而又被成為二叉堆,這里我們以Java代碼為例講解堆的性質(zhì)和基本操作以及排序方法,需要的朋友可以參考下

堆的性質(zhì)
堆是一棵完全二叉樹,實(shí)際中可以通過一個(gè)數(shù)組來實(shí)現(xiàn),它最重要的一個(gè)性質(zhì)是:任意節(jié)點(diǎn)都小于(大于)等于其子節(jié)點(diǎn)。將根節(jié)點(diǎn)最小的堆稱為最小堆,根節(jié)點(diǎn)最大的堆稱為最大堆。下圖給出了一個(gè)最大堆的示例及其數(shù)組表示,可以直觀地看出每個(gè)節(jié)點(diǎn)都比它的孩子們都要大。

201668115430035.jpg (815×272)

在上圖中可以看到,完全二叉樹的節(jié)點(diǎn)可以從根節(jié)點(diǎn)編號(hào)為1開始按順序排列,對(duì)應(yīng)數(shù)組A中的索引(注意此處下標(biāo)是從1開始的)。給定一個(gè)節(jié)點(diǎn)i,我們很容易可以得到它的左孩子是2i,右孩子是2i+1,父節(jié)點(diǎn)是i/2

堆的基本操作
堆有兩種基本操作(下面以最小堆為例):
插入元素k:直接將k添加到數(shù)組最后,然后向上冒泡(bubble-up)調(diào)整堆。向上冒泡操作:將要調(diào)整的元素與其父節(jié)點(diǎn)比較,如果大于其父節(jié)點(diǎn)則交換,直到恢復(fù)堆的性質(zhì)。
提取最值:最值即根元素。然后將其刪除,令根元素=最后的葉子結(jié)點(diǎn)元素,然后從根元素開始向下冒泡(bubble-down)調(diào)整堆。向下冒泡操作:每次應(yīng)該從要調(diào)整節(jié)點(diǎn),其左右孩子一共三個(gè)節(jié)點(diǎn)中選擇最小的子節(jié)點(diǎn)來交換(如果最小就是其本身就不用交換),直到恢復(fù)堆的性質(zhì)。
實(shí)際中經(jīng)常需要將一個(gè)包含n個(gè)元素?zé)o序數(shù)組建立成堆,下面的Heap類中的構(gòu)造方法將展示如何通過_bubbleDown向下冒泡調(diào)整來建堆。堆實(shí)質(zhì)上是一棵完全二叉樹,樹高總為lognlog⁡n,每種基本操作的耗時(shí)操作都在于冒泡調(diào)整以滿足堆的性質(zhì),因此它們的時(shí)間復(fù)雜度都是O(nlogn)O(nlog⁡n)。
Java示例:

//上浮
public void swim(int k){
  while(k/2>=1 && less(pq[k/2],pq[k])){
    exch(pq,k/2,k);
    k=k/2;
  }
}
//下沉
private void sink() {
  int k=1;
  while(2*k<N){
    int j=2*k;
    if(less(pq[j],pq[j+1])) j++;
    if(less(pq[k],pq[j])) exch(pq,k,j);
    else break;
    k = j;
  }
}

堆排序?qū)崿F(xiàn)原理
分為兩步:
1.把數(shù)組排成二叉堆的順序
2.調(diào)換根節(jié)點(diǎn)和最后一個(gè)節(jié)點(diǎn)的位置,然后對(duì)根節(jié)點(diǎn)進(jìn)行下沉操作。

實(shí)現(xiàn):
可能我的代碼和上面的動(dòng)畫略有出入,不過基本原理差不多。

public class HeapSort extends BaseSort {

  private int N;
  @Override
  public void sort(Comparable[] a) {
    N =a.length-1;
    int k = N/2;
    while(k>=1){
      sink(a,k);
      k--;
    }
    k = 1;
    while(k<=N){
      exch(a,k,N--);
      sink(a,k);
    }
  }
}

相關(guān)文章

  • Java之Class.forName()用法案例詳解

    Java之Class.forName()用法案例詳解

    這篇文章主要介紹了Java之Class.forName()用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝教程

    windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝教程

    這篇文章主要介紹了windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • SpringBoot集成RocketMQ發(fā)送事務(wù)消息的原理解析

    SpringBoot集成RocketMQ發(fā)送事務(wù)消息的原理解析

    RocketMQ 的事務(wù)消息提供類似 X/Open XA 的分布事務(wù)功能,通過事務(wù)消息能達(dá)到分布式事務(wù)的最終一致,這篇文章主要介紹了SpringBoot集成RocketMQ發(fā)送事務(wù)消息,需要的朋友可以參考下
    2022-06-06
  • Java lastIndexOf類使用方法原理解析

    Java lastIndexOf類使用方法原理解析

    這篇文章主要介紹了Java lastIndexOf類使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot請(qǐng)求參數(shù)加密、響應(yīng)參數(shù)解密的實(shí)現(xiàn)

    SpringBoot請(qǐng)求參數(shù)加密、響應(yīng)參數(shù)解密的實(shí)現(xiàn)

    在項(xiàng)目開發(fā)工程中,有的項(xiàng)目可能對(duì)參數(shù)安全要求比較高,在整個(gè)http數(shù)據(jù)傳輸?shù)倪^程中都需要對(duì)請(qǐng)求參數(shù)、響應(yīng)參數(shù)進(jìn)行加密,本文主要介紹了SpringBoot請(qǐng)求參數(shù)加密、響應(yīng)參數(shù)解密的實(shí)現(xiàn),感興趣的可以了解一下
    2024-01-01
  • java把字符串寫入文件里的簡(jiǎn)單方法分享

    java把字符串寫入文件里的簡(jiǎn)單方法分享

    這篇文章主要介紹了java把字符串寫入到文件里的簡(jiǎn)單方法,這是跟一個(gè)外國(guó)朋友學(xué)的代碼,需要的朋友可以參考下
    2014-03-03
  • Mybatis中的@Select、foreach用法

    Mybatis中的@Select、foreach用法

    這篇文章主要介紹了Mybatis中的@Select、foreach用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java操作elasticsearch的案例解析

    java操作elasticsearch的案例解析

    這篇文章主要介紹了java操作elasticsearch的案例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)之有效隊(duì)列定義與用法示例

    Java數(shù)據(jù)結(jié)構(gòu)之有效隊(duì)列定義與用法示例

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之有效隊(duì)列定義與用法,結(jié)合實(shí)例形式分析了java有效隊(duì)列的數(shù)據(jù)插入、刪除、判斷、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Java Web學(xué)習(xí)之Cookie和Session的深入理解

    Java Web學(xué)習(xí)之Cookie和Session的深入理解

    這篇文章主要給大家介紹了關(guān)于Java Web學(xué)習(xí)之Cookie和Session的相關(guān)資料,需要的朋友可以參考下
    2018-04-04

最新評(píng)論

绥中县| 山阳县| 陆丰市| 德兴市| 凤冈县| 贵定县| 磐石市| 喀喇沁旗| 囊谦县| 上杭县| 惠州市| 呈贡县| 霍林郭勒市| 桂东县| 丹寨县| 平潭县| 绥芬河市| 安陆市| 营口市| 项城市| 沙坪坝区| 景洪市| 习水县| 贡觉县| 冀州市| 民和| 武定县| 惠州市| 同仁县| 关岭| 育儿| 高台县| 从化市| 金湖县| 莱芜市| 米脂县| 夏津县| 大石桥市| 道孚县| 安仁县| 西乌|