算法導(dǎo)論閱讀筆記3-堆排序

算法描述

堆排序(heapsort)與歸并排序一樣邮破,但不同于插入排序的是,其時間復(fù)雜度為O(nlgn)。而與插入排序相同,但不同于歸并排序的是更哄,堆排序同樣具有空間原址性:任何時候只需要常數(shù)個額外的元素空間存儲臨時數(shù)據(jù)。
在堆排序算法中扣草,我們使用的是最大堆佳头。最小堆通常用于構(gòu)造優(yōu)先隊列。
(二叉)堆是一個數(shù)組注竿,它可以被看成一個近似的完全二叉樹茄茁。除了最底層外,該樹是完全充滿的巩割,而且是從左到右填充裙顽。表示堆的數(shù)組A包含兩個屬性:A.length(通常)給出數(shù)組元素的個數(shù),A.heap-size表示有多少個堆元素存儲在該數(shù)組中宣谈。也就是說愈犹,雖然A[1..A.length]可能都存有數(shù)據(jù),但只有A[1..A.heap-size]中存放的是堆的有效元素闻丑,這里漩怎,0≤A.heap-size≤A.length。

維護堆的性質(zhì)

MAX-HEAFIFY用于維護最大堆的性質(zhì)梆掸。它的輸入為一個數(shù)組和一個下標i扬卷。在調(diào)用MAX-HEAPIFY的時候,我們假定根節(jié)點為LEFT(i)和RIGHT(i)的二叉樹都是最大堆酸钦,但這是A[i]有可能小于其孩子怪得,這違背了最大堆的性質(zhì)。MAX-HEAPIFY通過讓A[i]的值在最大堆中“逐級下降”卑硫,從而使得以下標i為根節(jié)點的子樹重新遵循最大堆的性質(zhì)徒恋。

MAX-HEAPIFY(A, i)
l = LEFT(i)
r = RIGHT(i)
if l <= A.heap-size and A[l] > A[i]
  largest = l
else
  largest = i
if r <= A.heap-size and A[r] > A[largest]
  largest = r
if largest != i
  exchange A[i] with A[largest]
  MAX-HEAPIFY(A, largest)
MAX-HEAPIFY示例

時間復(fù)雜度為O(lgn),即O(h)欢伏。

建堆

可以用自底向上的方法利用過程MAX-HEAPIFY把一個大小為n=A.length的數(shù)組A[1..n]轉(zhuǎn)換為最大堆入挣。子數(shù)組A(\lfloor{n/2}\rfloor+1..n)中的元素都是樹的葉子節(jié)點。每個葉節(jié)點都可以看成只包含一個元素的堆硝拧。過程BUILD-MAX-HEAP對樹中的其它節(jié)點都調(diào)用一次MAX-HEAPIFY径筏。

BUILD-MAX-HEAP(A)
A.heap-size = A.length
for i = A.length/2 downto 1
  MAX-HEAPIFY(A, i)

時間復(fù)雜度: O(n)葛假。

構(gòu)建堆的示例

堆排序算法

初始時,堆排序算法利用BUILD-MAX-HEAP將輸入數(shù)組A[1..n]建成最大堆滋恬,其中n=A.length聊训。因為數(shù)組中的最大元素總在根節(jié)點A[1]中,通過把它與A[n]進行互換恢氯,我們可以讓該元素放到正確的位置带斑。這時,如果我們從堆中去掉節(jié)點n(通過減少A.heap-size的值實現(xiàn))勋拟,剩余的節(jié)點中勋磕,原來根的孩子節(jié)點仍然是最大堆,而新的根節(jié)點可能會違背最大堆的性質(zhì)敢靡。為了維護最大堆的性質(zhì)挂滓,我們要做的是調(diào)用MAX-HEAPIFY(A, 1),從而在A[1..n-1]上構(gòu)造一個新的最大堆啸胧。最排序算法會不斷重復(fù)這一過程杂彭,直到堆的大小從n-1降到2。

HEAPSORT(A)
BUILD-MAX-HEAP(A)
for i = A.length downto 2
  exchange A[1] with A[i]
  A.heap-size = A.heap-size - 1
  MAX-HEAPIFY(A, 1)
HEAPSORT運行過程(部分)

優(yōu)先級隊列

優(yōu)先級隊列是一種用來維護由一組元素構(gòu)成的集合S的數(shù)據(jù)結(jié)構(gòu)吓揪,其中的每一個元素都有一個相關(guān)的值,稱為關(guān)鍵字所计。一個最大優(yōu)先級隊列支持以下操作:

  • INSERT(S, x): 把元素x插入集合S中柠辞。
  • MAXIMUM(S): 返回S中具有最大鍵字的元素。
  • EXTRACT-MAX(S): 去掉并返回S中具有最大鍵字的元素主胧。
  • INCREASE-KEY(S, x, k): 將元素x的關(guān)鍵字值增加到k叭首,這里假設(shè)k的值不小于x的原關(guān)鍵字值。
HEAP-MAXIMUM(A)
return A[1]

時間復(fù)雜度Θ(1)踪栋。

HEAP-EXTRACT-MAX(A)
if A.heap-size < 1
  error "heap underflow"
max = A[1]
A[1] = A[A.heap-size]
A.heap-size = A.heap-size - 1
MAX-HEAPIFY(A, 1)
return max

時間復(fù)雜度為O(lgn)焙格。

HEAP-INCREASE-KEY(A, i, key)
if key < A[i]
  error "new key is smaller than current key"
A[i] = key
while i > 1 and A[PARENT(i)] < A[i]
  exchange A[i] with A[PARENT(i)]
  i = PARENT(i)

時間復(fù)雜度為O(lgn).

MAX-HEAP-INSERT(A, key)
A.heap-size = A.heap-size + 1
A[A.heap-size] = -INF
HEAP-INCREASE-KEY(A, A.heap-size, key)

運行時間O(lgn)。

特性:

堆排序為非穩(wěn)定排序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夷都,一起剝皮案震驚了整個濱河市眷唉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囤官,老刑警劉巖冬阳,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異党饮,居然都是意外死亡肝陪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門刑顺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氯窍,“玉大人饲常,你說我怎么就攤上這事±翘郑” “怎么了贝淤?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熊楼。 經(jīng)常有香客問我霹娄,道長,這世上最難降的妖魔是什么鲫骗? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任犬耻,我火速辦了婚禮,結(jié)果婚禮上执泰,老公的妹妹穿的比我還像新娘枕磁。我一直安慰自己,他們只是感情好术吝,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布计济。 她就那樣靜靜地躺著,像睡著了一般排苍。 火紅的嫁衣襯著肌膚如雪沦寂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天淘衙,我揣著相機與錄音传藏,去河邊找鬼。 笑死彤守,一個胖子當著我的面吹牛毯侦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播具垫,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侈离,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筝蚕?” 一聲冷哼從身側(cè)響起卦碾,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饰及,沒想到半個月后蔗坯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡燎含,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年宾濒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屏箍。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绘梦,死狀恐怖橘忱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卸奉,我是刑警寧澤钝诚,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站榄棵,受9級特大地震影響凝颇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疹鳄,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一拧略、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘪弓,春花似錦垫蛆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呛占,卻和暖如春虑乖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晾虑。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工决左, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人走贪。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像惑芭,于是被迫代替她去往敵國和親坠狡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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