堆 03 提取 & 下沉

E extractMax() - 提取堆中最大的元素

  • 堆中最大的元素:
    • 堆中最大的元素就是堆頂?shù)脑兀?/li>
    • 從二叉樹的角度看玛瘸,堆中最大的元素就是二叉樹的根節(jié)點(diǎn)捧搞;
    • 從數(shù)組的角度看雷恃,堆中最大的元素就是數(shù)組中索引為0的元素驾茴;
  • 提取堆中最大的元素:
    • 找到堆中最大的元素并返回很簡(jiǎn)單,但提取涉及到要把最大的元素從堆中刪除(即邏輯上刪除二叉樹的根事格,物理上刪除數(shù)組索引為0的元素)惕艳,就要重組剩余元素的結(jié)構(gòu),使之仍然能夠滿足堆的定義驹愚;
    • 具體刪除最大堆中的堆頂元素的做法如下:
      • 讓堆頂元素和堆中最后一個(gè)元素互換位置远搪;
      • 刪除堆中最后一個(gè)元素,即剛換過(guò)來(lái)的原堆頂元素逢捺;
      • 下沉新堆頂元素谁鳍,使整個(gè)二叉樹重新滿足堆的定義;
// 看堆中的最大元素
public E findMax(){
    if(data.getSize() == 0)
        throw new IllegalArgumentException("Can not findMax when heap is empty.");
    return data.get(0);
}

// 取出堆中最大元素
public E extractMax(){
    E ret = findMax();

    data.swap(0, data.getSize() - 1);
    data.removeLast();
    siftDown(0);

    return ret;
}

void siftDown(int k) - 下沉新的堆頂元素

  • 下沉的終止條件劫瞳,即k指向的元素已經(jīng)沒(méi)有可下沉的空間了倘潜,這個(gè)狀態(tài)為:k的左孩子的索引已經(jīng)大于等于size,size從索引的角度看志于,指向下一個(gè)碼元素的位置涮因;當(dāng)堆中只有一個(gè)元素,size==1伺绽,size指向堆頂元素的左孩子养泡,堆頂元素左孩子的索引也是1,下一個(gè)堆中元素的碼放位置是堆頂元素左孩子的位置憔恳,說(shuō)明堆頂元素沒(méi)有左孩子瓤荔,更沒(méi)有右孩子,這就是k沒(méi)有下沉空間的狀態(tài)了钥组,k但凡還有個(gè)左孩子(就是有孩子输硝,k還沒(méi)到最底層),它就還有下沉的空間程梦;
  • 用一個(gè)指針j指向k的左孩子点把;
  • 看 k 是否還有右孩子,并且 k 的右孩子比 k 的左孩子大屿附,那么讓 j 指向 k 的右孩子郎逃,否則 j 還指向 k 的左孩子,此時(shí) j 指向 k 的疑似下沉位置挺份;
  • k 和其疑似下沉位置做比較褒翰,如果 k 不比其疑似下沉位置的元素小,則不需要下沉,跳出循環(huán)优训,下沉動(dòng)作結(jié)束朵你;
  • 如果 k 比其疑似下沉位置的元素小,開始下沉動(dòng)作揣非,交換 k 和其疑似下沉位置的元素抡医;
  • 下沉完成以后,讓 k 重新追上待下沉元素早敬;
private void siftDown(int k){
    while(leftChild(k) < data.getSize()){
        int j = leftChild(k); 
        // 如果k有右孩子忌傻,并且右孩子比左孩子大
        if( j + 1 < data.getSize() &&
                data.get(j + 1).compareTo(data.get(j)) > 0 )
            j ++;   // j 指向 leftChild 和 rightChild 中更大的那一個(gè)
    
        // 如果不需要下沉,跳出循環(huán)搞监,下沉動(dòng)作結(jié)束
        if(data.get(k).compareTo(data.get(j)) >= 0 )
            break;
        
        // k 和 j 交換位置水孩,待下沉元素和左右孩子中更大的那個(gè)交換位置
        data.swap(k, j);
        // k 重新追上待下沉的元素
        k = j;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腺逛,隨后出現(xiàn)的幾起案子荷愕,更是在濱河造成了極大的恐慌衡怀,老刑警劉巖棍矛,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抛杨,居然都是意外死亡够委,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門怖现,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茁帽,“玉大人,你說(shuō)我怎么就攤上這事屈嗤∨瞬Γ” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵饶号,是天一觀的道長(zhǎng)铁追。 經(jīng)常有香客問(wèn)我,道長(zhǎng)茫船,這世上最難降的妖魔是什么琅束? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮算谈,結(jié)果婚禮上涩禀,老公的妹妹穿的比我還像新娘。我一直安慰自己然眼,他們只是感情好艾船,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般屿岂。 火紅的嫁衣襯著肌膚如雪礁蔗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天雁社,我揣著相機(jī)與錄音浴井,去河邊找鬼。 笑死霉撵,一個(gè)胖子當(dāng)著我的面吹牛磺浙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徒坡,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼撕氧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了喇完?” 一聲冷哼從身側(cè)響起伦泥,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锦溪,沒(méi)想到半個(gè)月后不脯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刻诊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年防楷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片则涯。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡复局,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粟判,到底是詐尸還是另有隱情亿昏,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布档礁,位于F島的核電站角钩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏事秀。R本人自食惡果不足惜彤断,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望易迹。 院中可真熱鬧宰衙,春花似錦、人聲如沸睹欲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至袋哼,卻和暖如春冀墨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涛贯。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工诽嘉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弟翘。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓虫腋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親稀余。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悦冀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容