說說算法那些事-堆排序

堆排序(Heapsort)是指利用堆積樹(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法,它是選擇排序的一種笆焰。堆分為大根堆和小根堆劫谅。大根堆的要求是每個節(jié)點的值都不大于其父節(jié)點的值。?在數(shù)組的非降序排序中嚷掠,需要使用的就是大根堆捏检,因為根據(jù)大根堆的要求可知,最大的值一定在堆頂叠国。查看完整代碼

1.堆的存儲:ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2)未檩,當(dāng)然,這是小根堆粟焊,大根堆則換成>=號冤狡。//k(i)父節(jié)點,K(2i)則是左子節(jié)點项棠,k(2i+1)是右子節(jié)點


2.算法思想:

(1) 先將構(gòu)建一個大根堆悲雳,此堆為初始的無序區(qū)

(2) 再將堆頂(根節(jié)點)與最后一個元素交換,由此得到新的無序區(qū)array[1..n-1]和有序區(qū)array[n]香追。

(3)由于交換后新的無序區(qū)可能違反堆性質(zhì)合瓢,故應(yīng)將新的無序區(qū)再一次調(diào)整為堆。然后再進(jìn)行(2)操作透典,直到無序區(qū)只有一個元素為止晴楔。此時排序結(jié)束

3.算法步驟:

(1)建堆,建堆是不斷調(diào)整堆的過程峭咒,從len/2處開始調(diào)整税弃,一直到第一個節(jié)點,此處len是堆中元素的個數(shù)凑队。建堆的過程是線性的過程则果,從len/2到0處一直調(diào)用調(diào)整堆的過程,相當(dāng)于o(h1)+o(h2)…+o(hlen/2) 其中h表示節(jié)點的深度,len/2表示節(jié)點的個數(shù)西壮,這是一個求和的過程遗增,結(jié)果是線性的O(n)。

(2)調(diào)整堆:調(diào)整堆在構(gòu)建堆的過程中會用到款青,而且在堆排序過程中也會用到做修。利用的思想是比較節(jié)點i和它的孩子節(jié)點left(i),right(i),選出三者最大(或者最小)者可都,如果最大(谢捍)值不是節(jié)點i而是它的一個孩子節(jié)點,那邊交互節(jié)點i和該節(jié)點渠牲,然后再調(diào)用調(diào)整堆過程旋炒,這是一個遞歸的過程。調(diào)整堆的過程時間復(fù)雜度與堆的深度有關(guān)系签杈,是lgn的操作瘫镇,因為是沿著深度方向進(jìn)行調(diào)整的。

(3)堆排序:堆排序是利用上面的兩個過程來進(jìn)行的答姥。首先是根據(jù)元素構(gòu)建堆铣除。然后將堆的根節(jié)點取出(一般是與最后一個節(jié)點進(jìn)行交換),將前面len-1個節(jié)點繼續(xù)進(jìn)行堆調(diào)整的過程鹦付,然后再將根節(jié)點取出尚粘,這樣一直到所有節(jié)點都取出。堆排序過程的時間復(fù)雜度是O(nlgn)敲长。因為建堆的時間復(fù)雜度是O(n)(調(diào)用一次)郎嫁;調(diào)整堆的時間復(fù)雜度是lgn,調(diào)用了n-1次祈噪,所以堆排序的時間復(fù)雜度是O(nlgn)

4.算法分析:

時間復(fù)雜度:O(N*logN)由于建初始堆所需的比較次數(shù)較多泽铛,所以堆排序不適合較少的

空間復(fù)雜度:堆排序是就地排序,空間復(fù)雜度O(1)

穩(wěn)定性:不穩(wěn)定的一種排序算法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辑鲤,一起剝皮案震驚了整個濱河市盔腔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌月褥,老刑警劉巖弛随,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宁赤,居然都是意外死亡撵幽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門礁击,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事哆窿×戳遥” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵挚躯,是天一觀的道長强衡。 經(jīng)常有香客問我,道長码荔,這世上最難降的妖魔是什么漩勤? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缩搅,結(jié)果婚禮上越败,老公的妹妹穿的比我還像新娘。我一直安慰自己硼瓣,他們只是感情好究飞,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堂鲤,像睡著了一般亿傅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘟栖,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天葵擎,我揣著相機與錄音,去河邊找鬼半哟。 笑死酬滤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镜沽。 我是一名探鬼主播敏晤,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缅茉!你這毒婦竟也來了嘴脾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蔬墩,失蹤者是張志新(化名)和其女友劉穎译打,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拇颅,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡奏司,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了樟插。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韵洋。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡竿刁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搪缨,到底是詐尸還是另有隱情食拜,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布副编,位于F島的核電站负甸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痹届。R本人自食惡果不足惜呻待,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望队腐。 院中可真熱鬧蚕捉,春花似錦、人聲如沸香到。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悠就。三九已至千绪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梗脾,已是汗流浹背荸型。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炸茧,地道東北人瑞妇。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像梭冠,于是被迫代替她去往敵國和親辕狰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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

  • 概述 排序有內(nèi)部排序和外部排序控漠,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序蔓倍,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,183評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序盐捷,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序偶翅,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,730評論 0 15
  • 排序的基本概念 在計算機程序開發(fā)過程中碉渡,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關(guān)鍵字進(jìn)行排序聚谁,排序完成的序列可用于快...
    Jack921閱讀 1,428評論 1 4
  • 昨晚在炳炳家,三個孩子玩的開心滞诺。孩子接觸不同性格的小朋友挺好形导。我和淞淞在炳炳家都很放松环疼。 中午和小姨...
    趙妖鏡Karen閱讀 148評論 0 0
  • 在看“歡樂頌”的時候我很喜歡看關(guān)關(guān)的部分,可能是因為我覺得我跟關(guān)關(guān)在某些地方很像吧朵耕。關(guān)關(guān)說:“你知道嗎秦爆,從小到大,...
    沒有發(fā)芽的竹子閱讀 368評論 3 3