《算法導(dǎo)論》讀書筆記第六章堆排序_第1頁
《算法導(dǎo)論》讀書筆記第六章堆排序_第2頁
《算法導(dǎo)論》讀書筆記第六章堆排序_第3頁
《算法導(dǎo)論》讀書筆記第六章堆排序_第4頁
《算法導(dǎo)論》讀書筆記第六章堆排序_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第六章堆排序堆排(.heapsort).像合并排序而不像插入排序,堆排序的運(yùn)行時間為0(幾仗,);像插入排序而不像合并排序,它是一種原地(粗必心)排序算法:在任何時候,數(shù)組中只有常數(shù)個元素在輸入數(shù)組外。它結(jié)合了插入排序與合并排序兩種算法的優(yōu)點(diǎn)。(二叉)堆數(shù)據(jù)結(jié)構(gòu)是一種數(shù)組對象,它可以被視為一棵完全二叉樹。表示堆的數(shù)組月是一個具有兩個屬性的對象:血初川人是數(shù)組中的元素個數(shù);heap-s訟園是存放在力中的堆的元素個數(shù)。雖然川1血/川A中可以包含有效值,但是人險側(cè)-sizeA_后的元素都不屬于相應(yīng)的堆。此處/比sizeAlen(jthA,樹的根為川1,對于給定了的某個結(jié)點(diǎn)的下標(biāo)”,其父結(jié)點(diǎn)為PARE

2、NT(i)、左兒子為LEFT、右兒子為RJGHT。計算方法:Parent(z)returnZ/2JLeft)return2iRight(z)return2i+1二叉堆有兩種:最大堆(大根堆)和最小堆(小根堆X最大堆中除了根以外的每個結(jié)點(diǎn)APARENT(i)2曲,最大元素在根結(jié)點(diǎn)中;最小堆中除了根以外的每個結(jié)點(diǎn)iAPARF;NT(i)Ai,最小元素在根結(jié)點(diǎn)中。練習(xí)1最多的時候是當(dāng)這棵完全二叉樹為滿二叉樹的時候:2宀-1最少的時候是當(dāng)這棵完全二叉樹的最后一層只有一個葉子的時候:2-1+1=D2根據(jù)6.1-1:2ynw2/,+1-1L2*n=hQgnnW2h+1一1二”?lg(zt+1)-1Ign-

3、1lgn1hHj+n-2=r“nZ.n=1n4-zi2=Yl卩/艮卩1+722=-OfZZi+仇2=/故九1十刃2=故葉子結(jié)點(diǎn)的下標(biāo)從山/2+1開始(因為前面有M2個結(jié)點(diǎn))Max-Heafify(人2)ILEFT(i.)廠RIGHT)ifIheapsizeAandAlAiTOC o 1-5 h zthenlargestIelselargestAlar(jestthenlargestLriflargest豐ithenexchangeAioAl.ar(jest1()MMX-HEAPIFY(A.largest)當(dāng)MAX-IIEAPIFY作用在一棵以結(jié)點(diǎn)?為根、大小為n的子樹上時,其運(yùn)行時間為調(diào)整元素

4、冊、ALEFT(i)和的關(guān)系所用時間,再加上對以,的某個子結(jié)點(diǎn)為根的子樹遞歸調(diào)用M朮X-HEAPJFY所需的時間。,結(jié)點(diǎn)的子樹大小至多為277/3。最壞情況發(fā)生在最底層剛好半滿:n=2人一1+2“x舟,而最大子樹結(jié)點(diǎn)數(shù)為2】-1+22-1+2辦-】=2“一13-22;所以有切WT(2n/3)十(4(1),用T(n)=T(2n/:i)+曰(1床計算上限(使用主方法):6(卅叫)=e(n)=e(l)J(n)=0(1),因此可以解得T.)=G(d糾lgn)=e(lgn)由于我們采用上限來計算,因此最終的結(jié)果應(yīng)當(dāng)是T(n)=0血町也就是說,MAX-HEAPIFY作用于一個高度為加勺結(jié)點(diǎn)所需的運(yùn)行時間是

5、(心)MAX-“亦円“S過程保證了以,結(jié)點(diǎn)為根的子樹的最下層的一棵子樹(3個結(jié)點(diǎn)組成的子樹)是最大堆。練習(xí)1A=A=A=2MlN-HEAPIFY(/tZ)HEFT(i)rRIGHT(i)ifIheapsizeAand4/AithensmallestIelsesmallestzifrheapsizeAandArAsmallestthensmallestheap-s仏州/2的結(jié)點(diǎn)都是葉子結(jié)點(diǎn)。所以調(diào)用-過程對原來的堆不做任何改變。5Max-Heapify(4,i)whileTRUEdo/AithenlargestIelselargestAlar(jestthenlargestriflargest/

6、ithenexcfiangeAiAlar(jest6題目有錯誤,應(yīng)當(dāng)是最優(yōu)時間Q(lgn)對一個大小為“的堆,最優(yōu)情況下經(jīng)過的路徑是涵蓋了所有層最左邊結(jié)點(diǎn)的路徑。所以0(1)xQ(lgn)=Q(lgn)這樣就得到*X-丫過程運(yùn)行時間的確界為e(lgn)自底向上地用MMX-HEAPIFY個數(shù)組川1.n(此處=lenylhA)變成個最大堆。之?dāng)?shù)組A(n/2+1).7禪是葉子,因此對內(nèi)部結(jié)點(diǎn)川1.W/2調(diào)用MAX-HEAPIFY使得其滿足最大堆的特性:Build-Max-Heap(/4)heapsizeAlen(jthAforil.e.n(jtb.A/2downto1doMAX-HEAPIFY(A,

7、i)用循環(huán)不變式來證明此過程的正確性。BUILD-MAX-過程使整棵樹成為最大堆。初始化:在策一輪循環(huán)迭代前,i=bV2jo結(jié)點(diǎn)川/2+1,n/2十2,申都是葉結(jié)點(diǎn),也是平凡最大堆的根。保持:結(jié)點(diǎn),的子結(jié)點(diǎn)的編號均比,大(二叉樹結(jié)點(diǎn)編號的性質(zhì)X在循壞中,使用的是從大到小的“(自底而上),因此這些子結(jié)點(diǎn)已經(jīng)是最大堆根。這也是調(diào)用MAX-HEAPJFY(AX點(diǎn)減為最大堆的根的前提條件。而MAX-IIEAPIFY的調(diào)用保持了結(jié)點(diǎn)+1/+2,,加為最大堆根的性質(zhì)。(MAX-IIEAPIFY.程的性質(zhì)X而當(dāng)?變?yōu)锳1時,同樣又使得;-1結(jié)點(diǎn)成為最大堆的根,并保持譏十1.八結(jié)點(diǎn)為最大堆的根。終止:過程終止

8、時/=0,此時1.2.,沢都是最大堆的根,特別地,結(jié)點(diǎn)1就是一個最大堆的根。因此I3UILD-過程是正確的。練習(xí)1A=A=5,3,17,22,84,19,6,10,9A=A=A=A=2這樣是因為對當(dāng)前結(jié)點(diǎn)進(jìn)行操作時能夠保證以當(dāng)前結(jié)點(diǎn)為根的樹的子樹都已經(jīng)是最大堆了。(降低操作時間)3區(qū)分:結(jié)點(diǎn)的深度:與根節(jié)點(diǎn)的距離結(jié)點(diǎn)的高度:與最遠(yuǎn)葉子的距離題目應(yīng)該是寫錯了,應(yīng)當(dāng)是至多有皿/2葉如果是求上限的話就當(dāng)作他是一棵滿二叉樹來計算。設(shè)樹的深度為力(高度也是力),那么最底層共有滬個結(jié)點(diǎn),他們的高度是0,這棵二叉樹共有2*1-1個結(jié)點(diǎn)。(2/,+1-1)/2十1W2h(2fe+1-1)/20+1+1這個式子

9、等價于這個式子始終是成立的。因此在含72個元素的堆中,至多有陽2宀個高度為加勺結(jié)點(diǎn)。堆排序算法:數(shù)組的最后一個位首先使用BUILD-MAX-Q4P將輸入數(shù)組.11.川構(gòu)造成一個最大堆。數(shù)組中的最大元素在在根川1,通過與川訶(數(shù)組的最后一個元素)互換,這時最大元素在去掉結(jié)點(diǎn)門不算(通過減小吐切-s讓e/實現(xiàn)),然后通過MAX-HEAPIFY(A.V)iGAl.n-1建成最大堆。不斷重復(fù)這個過程。使在每個過程中最大的元素從結(jié)點(diǎn)開始從后往前排列。Heapsort(A)BUILD-MAX-HEAP(A)forilen()thAdownto2doexcliangeoAiheapsizeAheapsize

10、A1MAX-HEAPTFY(A,1)HEAPSORT的時間代價為Ofnlgrz)。(調(diào)用BUILD-MAX-HE/W的時間為n-詼HEAP-MAX-HEAPIFY調(diào)用中每一次的時間代價為O(lgn)練習(xí)1首先調(diào)用BUILD一MAX一刃E4P過程:A=A=A=八寸ddd.od.rd沁VHyz二mwdygHIXP/V旺嬰.A囲VHP、八pgK02000ECOIApquoo.omgzv丄、00AhoodI-T2”g.ON.3.gzv;卜Ahood02”g.ON.3.gzv;.9AhoodI-T2”2oz.巳將VH一、sAhoo.z.2J2”2ozloVH一、.寸Am”mzlov丄、mEOPUSE6=

11、2IS6UZili回咪呂堅1迴展蚩H3Ixp/v旺AgmmQOvn/nVH一、Apgunyr-i二I)fxy富旺嬰A8O302VHP、HyA寸.gd002.2VHyr-i二I)AJ7dp4HIxy/v旺AgmVHP.八寸&72200(I)HVSHIxp、/v旺嬰、A8ocVH、y、d&.A000VH一、Apgd.H200-lVHy.m此筆記尚未定稿如果問題和建議請聯(lián)系zhangshuijing歡迎指教A=,Af=,調(diào)用MAX一HEAPIFY(AA):1.A=然后A=,Af=,調(diào)用MAX一HEAPIFY(AA)然后A=,Af=5,7,8,13,17,20,25,調(diào)用MAX-HEAPIFY(AA)

12、:1.A=然后A=,調(diào)用MSXHEAPIFY(AA)最后A!=2假設(shè)力存放已排序數(shù)組初始化:在循環(huán)開始前,幻是空的,可以認(rèn)為是已排序的。保持:當(dāng),4成為一個最大ift.heap-曲麗=時,經(jīng)過操作月中最大的元素川1放KA,而heapsizeA=n1;而此時,經(jīng)過MAXHEAPIFY(4:1)過程后,A.n-1咸為最大堆,此時又將其中最大元素川1插入幻的最前面,然后heap-sizeA=n-2,而此時幻仍然是已排序的終止:heapsizeA=1,幻中已經(jīng)有1個兀素,并且是已排序的,最后將原來4中的最小元素,即此時的川1睛入力前,整個過程結(jié)束,川仍是已排序的。優(yōu)先級隊列是一種用來維護(hù)由一組元素構(gòu)成

13、的集合S數(shù)據(jù)結(jié)構(gòu),這一組元素中的每一個都有一個關(guān)鍵字辰么最個最大優(yōu)先級隊列支持以下操作:INSERTSx):把元素丿插入集合S(SSU;r)MAXIMUM(S):返回S中具有最大關(guān)鍵字的元素EXTRACT-MAX(S):提取最大元素INCREASE-KEY(S.k)將元素/關(guān)鍵字值增加至!U人值不能小于原關(guān)鍵字值。最大優(yōu)先級隊列的一個應(yīng)用是在一臺分時計算機(jī)上進(jìn)行作業(yè)調(diào)度。最小優(yōu)先級隊列支持的操作包括INSERT,MINIMUM,EXTRACT-MINQDECREASE-KEY。這種隊列可被用在基于事件驅(qū)動的模擬器中。優(yōu)先級隊列可以用堆來實現(xiàn)。IIeap-Maximum(4)returnAlHeap-Extract-Max(A)ifheapsizeA1thenerrorheapunderflowmaxAl/11A!ieapsizeAheapsizeAheapsizeA1MAX-HEAPIFY(A.l)return

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論