亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

堆排序

系統(tǒng) 1949 0

五. 堆排序

1、堆排序定義
 n個關(guān)鍵字序列K l ,K 2 ,…,K n 稱為堆,當且僅當該序列滿足如下性質(zhì)(簡稱為堆性質(zhì)):
 (1)k i ≤K 2i 且k i ≤K 2i+1 或(2)K i ≥K 2i 且k i ≥K 2i+1 (1≤i≤ )

 若將此序列所存儲的向量R[1..n]看做是一棵完全二叉樹的存儲結(jié)構(gòu),則堆實質(zhì)上是滿足如下性質(zhì)的完全二叉樹:樹中任一非葉結(jié)點的關(guān)鍵字均不大于(或不小于)其左右孩子(若存在)結(jié)點的關(guān)鍵字。
【例】關(guān)鍵字序列(10,15,56,25,30,70)和(70,56,30,25,15,10)分別滿足堆性質(zhì)(1)和(2),故它們均是堆,其對應(yīng)的完全二叉樹分別如小根堆示例和大根堆示例所示。

2、大根堆和小根堆
 根結(jié)點(亦稱為堆頂)的關(guān)鍵字是堆里所有結(jié)點關(guān)鍵字中最小者的堆稱為小根堆。
 根結(jié)點(亦稱為堆頂)的關(guān)鍵字是堆里所有結(jié)點關(guān)鍵字中最大者,稱為大根堆。
注意:
?、俣阎腥我蛔訕湟嗍嵌?。
?、谝陨嫌懻摰亩褜嶋H上是二叉堆(BinaryHeap),類似地可定義k叉堆。

3、堆排序特點
 堆排序(HeapSort)是一樹形選擇排序。
 堆排序的特點是:在排序過程中,將R[l..n]看成是一棵完全二叉樹的順序存儲結(jié)構(gòu),利用完全二叉樹中雙親結(jié)點和孩子結(jié)點之間的內(nèi)在關(guān)系【參見二叉樹的順序存儲結(jié)構(gòu)】,在當前無序區(qū)中選擇關(guān)鍵字最大(或最小)的記錄。

4、堆排序與直接插入排序的區(qū)別
 直接選擇排序中,為了從R[1..n]中選出關(guān)鍵字最小的記錄,必須進行n-1次比較,然后在R[2..n]中選出關(guān)鍵字最小的記錄,又需要做n-2次比較。事實上,后面的n-2次比較中,有許多比較可能在前面的n-1次比較中已經(jīng)做過,但由于前一趟排序時未保留這些比較結(jié)果,所以后一趟排序時又重復(fù)執(zhí)行了這些比較操作。
 堆排序可通過樹形結(jié)構(gòu)保存部分比較結(jié)果,可減少比較次數(shù)。

5、堆排序
堆排序利用了大根堆(或小根堆)堆頂記錄的關(guān)鍵字最大(或最小)這一特征,使得在當前無序區(qū)中選取最大(或最小)關(guān)鍵字的記錄變得簡單。

(1)用大根堆排序的基本思想
①先將初始文件R[1..n]建成一個大根堆,此堆為初始的無序區(qū)
②再將關(guān)鍵字最大的記錄R[1](即堆頂)和無序區(qū)的最后一個記錄R[n]交換,由此得到新的無序區(qū)R[1..n-1]和有序區(qū)R[n],且滿足R[1..n-1].keys≤R[n].key
③由于交換后新的根R[1]可能違反堆性質(zhì),故應(yīng)將當前無序區(qū)R[1..n-1]調(diào)整為堆。然后再次將R[1..n-1]中關(guān)鍵字最大的記錄R[1]和該區(qū)間的最后一個記錄R[n-1]交換,由此得到新的無序區(qū)R[1..n-2]和有序區(qū)R[n-1..n],且仍滿足關(guān)系R[1..n-2].keys≤R[n-1..n].keys,同樣要將R[1..n-2]調(diào)整為堆。
……
直到無序區(qū)只有一個元素為止。

(2)大根堆排序算法的基本操作:
① 初始化操作:將R[1..n]構(gòu)造為初始堆;
②每一趟排序的基本操作:將當前無序區(qū)的堆頂記錄R[1]和該區(qū)間的最后一個記錄交換,然后將新的無序區(qū)調(diào)整為堆(亦稱重建堆)。
注意:
①只需做n-1趟排序,選出較大的n-1個關(guān)鍵字即可以使得文件遞增有序。
②用小根堆排序與利用大根堆類似,只不過其排序結(jié)果是遞減有序的。堆排序和直接選擇排序相反:在任何時刻,堆排序中無序區(qū)總是在有序區(qū)之前,且有序區(qū)是在原向量的尾部由后往前逐步擴大至整個向量為止。

(3)堆排序的算法:
void HeapSort(SeqIAst R)
{//對R[1..n]進行堆排序,不妨用R[0]做暫存單元
inti;
BuildHeap(R); //將R[1-n]建成初始堆
for(i=n;i>1;i--){//對當前無序區(qū)R[1..i]進行堆排序,共做n-1趟。
R[0]=R[1];R[1]=R[i];R[i]=R[0];//將堆頂和堆中最后一個記錄交換
 Heapify(R,1,i-1);//將R[1..i-1]重新調(diào)整為堆,僅有R[1]可能違反堆性質(zhì)
} //endfor
} //HeapSort

(4)BuildHeap和Heapify函數(shù)的實現(xiàn)
 因為構(gòu)造初始堆必須使用到調(diào)整堆的操作,先討論Heapify的實現(xiàn)。
① Heapify函數(shù)思想方法
 每趟排序開始前R[l..i]是以R[1]為根的堆,在R[1]與R[i]交換后,新的無序區(qū)R[1..i-1]中只有R[1]的值發(fā)生了變化,故除R[1]可能違反堆性質(zhì)外,其余任何結(jié)點為根的子樹均是堆。因此,當被調(diào)整區(qū)間是R[low..high]時,只須調(diào)整以R[low]為根的樹即可。
"篩選法"調(diào)整堆
 R[low]的左、右子樹(若存在)均已是堆,這兩棵子樹的根R[2low]和R[2low+1]分別是各自子樹中關(guān)鍵字最大的結(jié)點。若R[low].key不小于這兩個孩子結(jié)點的關(guān)鍵字,則R[low]未違反堆性質(zhì),以R[low]為根的樹已是堆,無須調(diào)整;否則必須將R[low]和它的兩個孩子結(jié)點中關(guān)鍵字較大者進行交換,即R[low]與R[large](R[large].key=max(R[2low].key,R[2low+1].key))交換。交換后又可能使結(jié)點R[large]違反堆性質(zhì),同樣由于該結(jié)點的兩棵子樹(若存在)仍然是堆,故可重復(fù)上述的調(diào)整過程,對以R[large]為根的樹進行調(diào)整。此過程直至當前被調(diào)整的結(jié)點已滿足堆性質(zhì),或者該結(jié)點已是葉子為止。上述過程就象過篩子一樣,把較小的關(guān)鍵字逐層篩下去,而將較大的關(guān)鍵字逐層選上來。因此,有人將此方法稱為"篩選法"。

②BuildHeap的實現(xiàn)
  要將初始文件R[l..n]調(diào)整為一個大根堆,就必須將它所對應(yīng)的完全二叉樹中以每一結(jié)點為根的子樹都調(diào)整為堆。
  顯然只有一個結(jié)點的樹是堆,而在完全二叉樹中,所有序號 的結(jié)點都是葉子,因此以這些結(jié)點為根的子樹均已是堆。這樣,我們只需依次將以序號為 , -1,…,1的結(jié)點作為根的子樹都調(diào)整為堆即可。

=================================================================================

5.1. 基本思想:

  堆排序是一樹形選擇排序,在排序過程中,將R[1..N]看成是一顆完全二叉樹的順序存儲結(jié)構(gòu),利用完全二叉樹中雙親結(jié)點和孩子結(jié)點之間的內(nèi)在關(guān)系來選擇最小的元素。

  5.2. 堆的定義:

  N個元素的序列K1,K2,K3,...,Kn.稱為堆,當且僅當該序列滿足特性:Ki≤K2iKi ≤K2i+1(1≤ I≤ [N/2])。


  堆實質(zhì)上是滿足如下性質(zhì)的完全二叉樹:樹中任一非葉子結(jié)點的關(guān)鍵字均大于等于其孩子結(jié)點的關(guān)鍵字。例如序列10,15,56,25,30,70就是一個堆,它對應(yīng)的完全二叉樹如上圖所示。這種堆中根結(jié)點(稱為堆頂)的關(guān)鍵字最小,我們把它稱為小根堆。反之,若完全二叉樹中任一非葉子結(jié)點的關(guān)鍵字均大于等于其孩子的關(guān)鍵字,則稱之為大根堆。

  5.3. 排序過程:

  堆排序正是利用小根堆(或大根堆)來選取當前無序區(qū)中關(guān)鍵字?。ɑ蜃畲螅┑挠涗泴崿F(xiàn)排序的。我們不妨利用大根堆來排序。每一趟排序的基本操作是:將當前無序區(qū)調(diào)整為一個大根堆,選取關(guān)鍵字最大的堆頂記錄,將它和無序區(qū)中的最后一個記錄交換。這樣,正好和直接選擇排序相反,有序區(qū)是在原記錄區(qū)的尾部形成并逐步向前擴大到整個記錄區(qū)。

  【示例】:對關(guān)鍵字序列42,13,91,23,24,16,05,88建堆。

?
堆排序 堆排序
堆排序 堆排序
堆排序

堆排序


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!?。?/p>

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 青青操在线观看 | 成人毛片免费观看视频大全 | 婷婷久久精品 | 国产午夜精品一区二区三区 | 久久96国产精品久久久 | 福利免费观看 | 天天干天天色天天射 | 欧美在线观看一区二区三 | 国产成人啪精品 | 99爱免费观看视频在线 | 亚洲专区一路线二 | 国产精品亚洲第一区广西莫菁 | 久久九九99热这里只有精品 | 久久青草视频 | 玖玖精品国产 | 日韩国产精品欧美一区二区 | 青青青青在线成人视99 | 久久99亚洲精品久久久久99 | 日本韩国欧美一区 | 成人精品一区二区三区校园激情 | 久热网站 | 高清人人天天夜夜曰狠狠狠狠 | 看日本真人一一级特黄毛片 | 亚洲欧美一区二区三区久久 | 国产成+人+综合+亚洲 欧美 | 久久羞羞视频 | 美女视频很黄很暴黄是免费的 | 97免费在线观看 | 一级特黄特黄毛片欧美的 | 99国产精品久久 | 国产一区二区三区在线观看免费 | a免费国产一级特黄aa大 | 国产精品视频免费视频 | 久久久男女野外野战 | 免费视频网站在线观看黄 | 国产美女久久精品香蕉69 | 免费观看成人毛片 | 国产精品久久久久久久久久一区 | 有码中文字幕在线观看 | 成人欧美一区在线视频在线观看 | 亚洲热在线观看 |