關(guān)于“堆”結(jié)構(gòu)和“堆排序”的思想

大家好栖忠,我是“Stephen·謝”裁蚁,今天講一下關(guān)于數(shù)據(jù)結(jié)構(gòu)“堆”以及“堆排序”算法的相關(guān)內(nèi)容卵史。


“堆結(jié)構(gòu)”

前面的好幾篇文章都講到了樹(shù)的結(jié)構(gòu),今天要講的“堆”其實(shí)也是樹(shù)結(jié)構(gòu)的一種痛黎,我們看下圖:

堆結(jié)構(gòu)

很明顯予弧,我們發(fā)現(xiàn)它們都是“二叉樹(shù)”,并且還是“完全二叉樹(shù)”湖饱,左圖中根節(jié)點(diǎn)是所有元素中最大的掖蛤,右圖中根節(jié)點(diǎn)是所有元素中最小的,左圖中每個(gè)節(jié)點(diǎn)都比它左右孩子要大井厌,右圖中每個(gè)節(jié)點(diǎn)都比它左右孩子要小坠七。這便是我們要講的“堆”結(jié)構(gòu)。

堆結(jié)構(gòu)中旗笔,每個(gè)節(jié)點(diǎn)的值都大于或等于其左右孩子節(jié)點(diǎn)的值稱為“大頂堆”彪置,每個(gè)節(jié)點(diǎn)的值都小于或等于其左右孩子節(jié)點(diǎn)的值稱為“小頂堆”。

注意蝇恶,根節(jié)點(diǎn)一定是堆中所有節(jié)點(diǎn)最大(腥)者,較大(写榛 )的節(jié)點(diǎn)靠近根節(jié)點(diǎn)潘懊。(但也不絕對(duì),如右圖小頂堆中60贿衍、40均小于70授舟,但他們并沒(méi)有比70更靠近根節(jié)點(diǎn))

我們?nèi)绻凑铡皩有虮闅v”的方式給節(jié)點(diǎn)從1號(hào)開(kāi)始編號(hào),則節(jié)點(diǎn)之間滿足以下關(guān)系:

堆的節(jié)點(diǎn)間的關(guān)系(n表示節(jié)點(diǎn)總數(shù))

此公式一定要看懂贸辈,一定要理解i释树,2i,2i+1,[n/2]對(duì)于堆結(jié)構(gòu)而言代表著什么奢啥。


“堆排序算法”

堆結(jié)構(gòu)的根節(jié)點(diǎn)是最大或最小的這個(gè)特點(diǎn)給了我們靈感秸仙,我們或許可以利用堆的這個(gè)特點(diǎn)來(lái)進(jìn)行排序的實(shí)現(xiàn)。

堆排序(Heap Sort)就是利用堆(假設(shè)利用大頂堆)進(jìn)行排序的方法桩盲。它的基本思想是:將待排序的序列構(gòu)成一個(gè)大頂堆寂纪,此時(shí),整個(gè)序列的最大值就是堆頂?shù)母?jié)點(diǎn)赌结,再將它移走(其實(shí)就是將其與堆數(shù)組的末尾元素交換捞蛋,此時(shí)末尾元素就是最大值),然后將剩余的n-1個(gè)序列重新構(gòu)造成一個(gè)大頂堆柬姚,這樣就會(huì)得到這n個(gè)元素中的次小值襟交。如此反復(fù)執(zhí)行,便能得到一個(gè)有序序列了伤靠。

堆排序思路圖例

上面圖例中對(duì)堆排序思想的展示再清晰不過(guò)了。不過(guò)現(xiàn)實(shí)中我們需要解決兩個(gè)問(wèn)題啼染,第一:如何由一個(gè)無(wú)序序列構(gòu)建成一個(gè)堆宴合;第二:如何在得到堆頂元素后,調(diào)整剩余的元素成為一個(gè)新的堆迹鹅。

上代碼截圖:

堆排序算法的代碼實(shí)現(xiàn)

從代碼中可以看出卦洽,整個(gè)排序過(guò)程分為兩個(gè)循環(huán),第一個(gè)循環(huán)要完成的就是將現(xiàn)在的待排序序列構(gòu)建成一個(gè)大頂堆斜棚,第二個(gè)循環(huán)要完成的就是逐步將每個(gè)最大值的根節(jié)點(diǎn)與末尾元素交換阀蒂,并再調(diào)整其成為一個(gè)大頂堆。用動(dòng)態(tài)圖形象地表示如下:

堆排序

解釋一下無(wú)非就兩點(diǎn):

1弟蚀、 從下往上蚤霞,從右往左地順序查找每個(gè)非葉子結(jié)點(diǎn),對(duì)比子結(jié)點(diǎn)义钉,與最大結(jié)點(diǎn)交換位置昧绣,交換的新位置再與其子結(jié)點(diǎn)比較、移動(dòng)捶闸,遍歷后最終找到最大值夜畴。

2、把堆頂和最后的元素交換位置删壮,排除最后的位置贪绘,重復(fù)1步驟,找到遍歷后的最大值央碟,放到倒數(shù)第二的位置税灌,依次直到結(jié)束。


堆排序復(fù)雜度分析

堆排序運(yùn)行時(shí)間主要是消耗在初始構(gòu)建堆和在重建堆時(shí)的反復(fù)篩選上。在構(gòu)建堆的過(guò)程中垄琐,對(duì)每個(gè)終端節(jié)點(diǎn)最多進(jìn)行兩次比較操作边酒,因此整個(gè)排序堆的時(shí)間復(fù)雜度為O(n)。在正式排序時(shí)狸窘,第i次取堆頂記錄重建堆需要用O(logi)的時(shí)間墩朦,并需要取n-1次堆頂記錄,因此總體來(lái)說(shuō)翻擒,堆排序的時(shí)間復(fù)雜度為O(nlogn)氓涣。由于堆排序?qū)υ紨?shù)據(jù)的排序狀態(tài)并不敏感,因此它無(wú)論是最好陋气、最壞和平均時(shí)間復(fù)雜度均為O(nlogn)劳吠。在這性能上顯然要遠(yuǎn)遠(yuǎn)好過(guò)于冒泡、選擇巩趁、插入的O(n2)的時(shí)間復(fù)雜度了痒玩。

空間復(fù)雜度上,它只有一個(gè)用來(lái)交換的暫存單元议慰,也是非常不錯(cuò)蠢古。不過(guò)由于記錄的比較和交換是跳躍式進(jìn)行,因此堆排序也是一種不穩(wěn)定的排序方法别凹。另外草讶,由于初始構(gòu)建堆排序需要的比較次數(shù)較多,因此炉菲,它不適合待排序序列個(gè)數(shù)較少的情況堕战。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拍霜,隨后出現(xiàn)的幾起案子嘱丢,更是在濱河造成了極大的恐慌,老刑警劉巖祠饺,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屿讽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡吠裆,警方通過(guò)查閱死者的電腦和手機(jī)伐谈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)试疙,“玉大人诵棵,你說(shuō)我怎么就攤上這事∽?酰” “怎么了履澳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵嘶窄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我距贷,道長(zhǎng)柄冲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任忠蝗,我火速辦了婚禮现横,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阁最。我一直安慰自己戒祠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布速种。 她就那樣靜靜地躺著姜盈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪配阵。 梳的紋絲不亂的頭發(fā)上馏颂,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音棋傍,去河邊找鬼救拉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舍沙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剔宪,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拂铡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了葱绒?” 一聲冷哼從身側(cè)響起感帅,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎地淀,沒(méi)想到半個(gè)月后失球,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帮毁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年实苞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烈疚。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黔牵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爷肝,到底是詐尸還是另有隱情猾浦,我是刑警寧澤陆错,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站金赦,受9級(jí)特大地震影響音瓷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夹抗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一绳慎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兔朦,春花似錦偷线、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至摆舟,卻和暖如春亥曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恨诱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工媳瞪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人照宝。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓蛇受,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親厕鹃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兢仰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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