什么是堆排序

閱讀原文

理解堆排,首先要理解二叉堆侈百。理解了二叉堆的“下沉”操作瓮下,基本上就可以理解堆排了。今天我們來看一看什么是堆钝域,以及堆的一般操作

優(yōu)先級隊列

近日讽坏,謙子遇到了煩心事,于是找老師去訴苦了


1.png

謙子列了幾個要做的事


2.png

謙子道出了心中的苦
3.png

謙子兩眼發(fā)光


4.png

克順手畫了一個圖
5.png

優(yōu)先級隊列中每個元素都有優(yōu)先級優(yōu)先級最高的最先被處理

優(yōu)先隊列的實現(xiàn)

6.png

謙子非常想知道黑盒里面是什么


7.png

克非常善于引導學生思考


8.png

謙子想了想說
10.png

謙子說著說著畫了一個圖
11.png

謙子畫了一幅圖解釋道


12.png

隨后网梢,謙子又畫出了插入6后的圖
13.png

克還是不滿意
14.png

15.png

這里我們只討論二叉堆震缭,把二叉堆稱為堆
堆也有d-堆,左式堆等等

16.png

克看謙子不是很明白战虏,順手畫了個圖


17.png

克畫了一個二叉堆實例


18.png

注意:二叉堆中兩個孩子之前的大小沒有關(guān)系拣宰,可能左孩子>=右孩子,也可能右>=左

19.png

克隨手畫了一個小根堆和一個大根堆


20.png

21.png

22.png

插入操作

23.png

每個父節(jié)點的值小于等于其左右孩子的值被稱為堆的有序性
另一種情況是大于等于也稱之為堆的有序性

克隨手畫了一個插入操作破壞堆有序性的圖


24.png

如何調(diào)整烦感,謙子心里想


25.png

上浮這個詞形象生動巡社,謙子心里想
26.png

說完,克飛速地寫出了上浮的代碼

/**
* 如果待插入的元素小于其父手趣,則交換子和父晌该,并繼續(xù)上浮肥荔,直到大于等于其父
* @param arr 儲存堆的數(shù)組,元素從下標1開始有效朝群,0位置不存在有效值
* @param inserted 被插入節(jié)點的索引
*/
public void swim(int[] arr, int inserted) {
    int parent = inserted/2;
    if (arr[inserted] < arr[parent]) {
        swap(arr, inserted, parent);
        swim(arr, parent);
    }
}

謙子暗自驚嘆老師的代碼功力

刪除操作

29.png

謙子聽完此話緊張的手心出汗燕耿,但還是硬著頭皮想了想,突然靈光一現(xiàn)


30.png

隨后謙子畫出了交換后的圖


31.png

32.png

33.png

34.png

35.png

謙子剛松了口氣姜胖,誰知還要寫代碼誉帅,只見謙子想了想,寫寫擦擦好幾遍最終寫下了如下代碼

/**
* 對以arr[parentIndex]為父節(jié)點的堆進行調(diào)整(下沉)
* 在父節(jié)點右莱,左右孩子中選出最小的節(jié)點蚜锨,如果最小節(jié)點不是父節(jié)點則交換
* 繼續(xù)下沉,反之不下沉
* @param arr 要調(diào)整的數(shù)組
* @param parentIndex 父節(jié)點的索引
*/
public void sink(int[] arr, int parentIndex) {
    // 堆的大小慢蜓,第0 個位置無有效值
    int heapSize = arr.length - 1;
    // 從父節(jié)點亚再,左孩子和右孩子選出最小節(jié)點,得其索引
    int minNodeIndex = minIndex(arr, parentIndex, heapSize);
    // 如果最小的節(jié)點的索引不是父節(jié)點晨抡,則說明最小的節(jié)點在左右孩子中氛悬,交換并繼續(xù)下沉調(diào)整
    if (minNodeIndex != parentIndex) {
        swap(arr, minNodeIndex, parentIndex);
        sink(arr, minNodeIndex);   // 交換后繼續(xù)下沉
    }
}
36.png

慧子解釋道,并畫了一個圖


37.png

只見謙子又寫了一段代碼

/**
* 求得給定的三個節(jié)點的最小節(jié)點的索引
* @param parentIndex 父節(jié)點的索引
* @param heapSize 堆的大小
* @return 最小節(jié)點的索引
*/
private int minIndex(int[] arr, int parentIndex, int heapSize) {
    int minIndex = parentIndex; // 保存最小節(jié)點的下標凄诞,初始時認為父節(jié)點最小
    int leftIndex = leftIndex(parentIndex);  // 找到parent的左孩子下標
    // 如果leftIndex沒有越界圆雁,比較左孩子和父節(jié)點,選擇小的Node的下標賦給minIndex
    if (leftIndex <= heapSize) {
        minIndex = arr[leftIndex] < arr[parentIndex] ? leftIndex : parentIndex;
    }
    int rightIndex = rightIndex(parentIndex);
    if (rightIndex < heapSize) {
        minIndex = arr[rightIndex] < arr[minIndex] ? rightIndex : minIndex;
    }
    return minIndex;
}

leftIndex = 2parentIndex;
rightIndex = 2
parentIndex+1;

40.png

看來以后得好好學數(shù)據(jù)結(jié)構(gòu)與算法了帆谍,不然連時間都管理不好伪朽,謙子心想
摘錄自:碼分享

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汛蝙,隨后出現(xiàn)的幾起案子烈涮,更是在濱河造成了極大的恐慌,老刑警劉巖窖剑,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坚洽,死亡現(xiàn)場離奇詭異,居然都是意外死亡西土,警方通過查閱死者的電腦和手機讶舰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來需了,“玉大人跳昼,你說我怎么就攤上這事±哒В” “怎么了鹅颊?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長墓造。 經(jīng)常有香客問我堪伍,道長锚烦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任帝雇,我火速辦了婚禮涮俄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摊求。我一直安慰自己禽拔,他們只是感情好刘离,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布室叉。 她就那樣靜靜地躺著,像睡著了一般硫惕。 火紅的嫁衣襯著肌膚如雪茧痕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天恼除,我揣著相機與錄音踪旷,去河邊找鬼。 笑死豁辉,一個胖子當著我的面吹牛令野,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徽级,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼气破,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了餐抢?” 一聲冷哼從身側(cè)響起现使,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旷痕,沒想到半個月后碳锈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡欺抗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年售碳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绞呈。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡贸人,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出报强,到底是詐尸還是另有隱情灸姊,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布秉溉,位于F島的核電站力惯,受9級特大地震影響碗誉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜父晶,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一哮缺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甲喝,春花似錦尝苇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至直撤,卻和暖如春非竿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谋竖。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工红柱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓖乘。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓锤悄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘉抒。 傳聞我的和親對象是個殘疾皇子零聚,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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