




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、堆與堆排序,軟件學(xué)院 王建文, 一、堆和堆排序的概念 二、堆的調(diào)整 三、建堆 四、堆排序,7.5.2 堆和堆排序,堆的定義: 若n個(gè)元素的序列a1 a2 an 滿(mǎn)足 ai a2i 或 ai a2i ai a2i+1 ai a2i+1 則分別稱(chēng)該序列a1 a2 an為小根堆 和大根堆。 從堆的定義可以看出,堆實(shí)質(zhì)是滿(mǎn)足如下性質(zhì)的完全二叉樹(shù): 二叉樹(shù)中任一非葉子結(jié)點(diǎn)均小于(大于)它的孩子結(jié)點(diǎn),例: 下面序列為堆,對(duì)應(yīng)的完全二叉樹(shù)分別為:,77 35 62 55 14 35 48 14 48 35 62 55 98 35 77,堆的應(yīng)用-優(yōu)先級(jí)隊(duì)列,服務(wù)排隊(duì)-見(jiàn)課本200, 例5.1 堆排序,堆排序
2、 若在輸出堆頂?shù)淖钚≈担ㄗ畲笾担┖螅沟檬S鄋-1個(gè)元素的序列重又建成一個(gè)堆,則得到n個(gè)元素的次小值(次大值)如此反復(fù),便能得到一個(gè)有序序列,這個(gè)過(guò)程稱(chēng)之為堆排序。,實(shí)現(xiàn)堆排序需解決兩個(gè)問(wèn)題: 1、如何由一個(gè)無(wú)序序列建成一個(gè)堆? 2、如何在輸出堆頂元素后,調(diào)整剩余元素為一個(gè)新的堆? 下面先討論第二個(gè)問(wèn)題:,一、堆和堆排序的概念 二、堆的調(diào)整 三、建堆 四、堆排序,7.5.2 堆和堆排序,如何在輸出堆頂元素后,調(diào)整剩余元素為一個(gè)新的堆? 解決方法: 輸出堆頂元素之后,以堆中最后一個(gè)元素替代之;然后將根結(jié)點(diǎn)值與左、右子樹(shù)的根結(jié)點(diǎn)值進(jìn)行比較,并與其中小者進(jìn)行交換;重復(fù)上述操作,直至葉子結(jié)點(diǎn),將得到新
3、的堆,稱(chēng)這個(gè)從堆頂至葉子的調(diào)整過(guò)程為“篩選”,13,38,27,49,76,65,49,97,13,輸出根并以最后一個(gè)元素代替之; 比較其左右孩子值的大小,并與其中較小者交換;,97,27,97,49,97,小根堆,堆調(diào)整與數(shù)組變化的關(guān)系,加入元素時(shí)向上調(diào)整 刪除元素時(shí)向下調(diào)整,加入元素,Fig. 27-2 The steps in adding 85 to the maxheap of Figure 27-1a,Adding an Entry,Begin at next available position for a leaf Follow path from this leaf towa
4、rd root until find correct position for new entry As this is done Move entries from parent to child Makes room for new entry,Adding an Entry,Fig. 27-3 A revision of steps shown in Fig. 27-2 to avoid swaps.,Adding an Entry,Fig. 27-4 An array representation of the steps in Fig. 27-3 continued ,Adding
5、an Entry,Fig. 27-4 (ctd.) An array representation of the steps in Fig. 27-3.,Adding an Entry-代碼見(jiàn)課本203,Algorithm for adding new entry to a heap,Algorithm add(newEntry)if (the array heap is full)Double the size of the arraynewIndex = index of next available array locationparentIndex = newIndex/2 / ind
6、ex of parent of available locationwhile (newEntry heapparentIndex)heapnewIndex = heapparentIndex / move parent to available location/ update indicesnewIndex = parentIndexparentIndex = newIndex/2 / end while,刪除元素,Fig. 27-5 The steps to remove the entry in the root of the maxheap of Fig. 27-3d,Removin
7、g the Root,Fig. 27-6 The steps that transform a semiheap into a heap without swaps.,你能畫(huà)出刪除堆頂元素時(shí)相應(yīng)數(shù)組的變化嗎? 刪除元素代碼見(jiàn)課本204,一、堆和堆排序的概念 二、堆的調(diào)整 三、建堆 四、堆排序,7.5.2 堆和堆排序,第一種方法:,把一個(gè)數(shù)組看成兩部分,左邊是堆,右邊是還沒(méi)加入堆的元素,步驟如下: 1、數(shù)組里的第一個(gè)元素自然地是一個(gè)堆 2、然后從第二個(gè)元素開(kāi)始,一個(gè)個(gè)地加入左邊的堆,當(dāng)然,每加入一個(gè)元素就破壞了左邊元素堆的性質(zhì),得重新把它調(diào)整為堆,創(chuàng)建堆,時(shí)間復(fù)雜度,該方法創(chuàng)建堆的時(shí)間復(fù)雜度為O
8、 (n log n),可以看出: 對(duì)一個(gè)無(wú)序序列反復(fù)“篩選”就可以得到一個(gè)堆 即:從一個(gè)無(wú)序序列建堆的過(guò)程就是一個(gè)反復(fù)“篩選”的過(guò)程。 那么:怎樣判斷一個(gè)序列是一個(gè)堆?或者說(shuō),建堆操作從哪兒著手?,第二種方法:自底向上創(chuàng)建堆,顯然: 單結(jié)點(diǎn)的二叉樹(shù)是堆;在完全二叉樹(shù)中所有以葉子結(jié)點(diǎn)(序號(hào)i n/2)為根的子樹(shù)是堆。 這樣,我們只需依次將以序號(hào)為n/2,n/21,, 1的結(jié)點(diǎn)為根的子樹(shù)均調(diào)整為堆即可。 即:對(duì)應(yīng)由n個(gè)元素組成的無(wú)序序列,“篩選”只需從第n/2個(gè)元素開(kāi)始。,由于堆實(shí)質(zhì)上是一個(gè)完全二叉樹(shù),那么我們可以順序存儲(chǔ)一個(gè)堆。 下面以一個(gè)實(shí)例介紹建一個(gè)小根堆的過(guò)程。 例:有關(guān)鍵字為49,38,
9、65,97,76,13,27,49的一組記錄,將其按關(guān)鍵字調(diào)整為一個(gè)小根堆。,49,38,65,97,76,13,27,49,首先, 調(diào)整從第n/2個(gè)元素開(kāi)始 將以該元素為根的二叉樹(shù)調(diào)整為堆 然后,將以序號(hào)為n/21的結(jié)點(diǎn)為根的二叉樹(shù)調(diào)整為堆; 再將以序號(hào)為n/22的結(jié)點(diǎn)為根的二叉樹(shù)調(diào)整為堆; 再將以序號(hào)為n/23的結(jié)點(diǎn)為根的二叉樹(shù)調(diào)整為堆;,49,65,97,76,13,49,38,27,97,49,97,49,65,13,65,13,49,49,13,13,27,49,27,49,Heapsort,Fig. 27-9 A trace of heapsort (a c),Heapsort,F
10、ig. 27-9 A trace of heapsort (d f),Heapsort,Fig. 27-9 A trace of heapsort (g i),Heapsort,Fig. 27-9 A trace of heapsort (j l),堆排序算法實(shí)現(xiàn),課本290頁(yè),Analysis,We visualize the worst-case time of a downheap with a proxy path that goes first right and then repeatedly goes left until the bottom of the heap (this
11、 path may differ from the actual downheap path) Since each node is traversed by at most two proxy paths, the total number of nodes of the proxy paths is O(n) Thus, bottom-up heap construction runs in O(n) time Bottom-up heap construction is faster than n successive insertions and speeds up the first phase of heap-sort,時(shí)間復(fù)雜度分析,該方法創(chuàng)建堆的時(shí)間復(fù)雜度為O(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南高一月考數(shù)學(xué)試卷
- 衡水中學(xué)復(fù)讀生數(shù)學(xué)試卷
- 廣東深圳高三聯(lián)盟數(shù)學(xué)試卷
- 河南省高考卷數(shù)學(xué)試卷
- 貴州四年級(jí)數(shù)學(xué)試卷
- 2025年水路貨物運(yùn)輸合同范本
- 護(hù)理禮儀與護(hù)士服飾
- 商業(yè)風(fēng)險(xiǎn)傳導(dǎo)機(jī)制-洞察及研究
- 橋梁工程試題及答案
- 汽車(chē)?yán)碚撛囶}及答案
- 廣東省2025年中考英語(yǔ)模擬試卷試題及答案詳解
- 2023年3月26日安徽省中小學(xué)新任教師公開(kāi)招聘《小學(xué)語(yǔ)文》試題及答案
- 小學(xué)一年級(jí)下冊(cè)數(shù)學(xué)口算題卡及口算天天練
- 2025新高考數(shù)學(xué)核心母題400道(教師版)
- 特種設(shè)備事故應(yīng)急處置
- 高端SPA會(huì)所的內(nèi)外環(huán)境設(shè)計(jì)藝術(shù)與實(shí)踐
- 廣告牌的施工方案
- 《國(guó)別和區(qū)域研究專(zhuān)題》教學(xué)大綱
- 《湍流中大尺度結(jié)構(gòu)對(duì)小尺度結(jié)構(gòu)的影響》
- DB33T 1180-2019 餐廚垃圾資源化利用技術(shù)規(guī)程
- 安徽省合肥市廬陽(yáng)區(qū)南門(mén)小學(xué)-2024-2025年第一學(xué)期辦公室工作總結(jié)(層峰辟新天)【課件】
評(píng)論
0/150
提交評(píng)論