堆排序 部落格園

2021-06-16 03:25:34 字數 848 閱讀 8051

先給出大根堆的定義:完全二叉樹,任一非葉子結點都大於等於它的孩子,也就是說根結點是最大的。而且顯然大根堆的任一棵子樹也是大根堆。

堆排序的基本思想是:記錄區的分為無序區和有序區前後兩部分;用無序區的數建大根堆,得到的根(最大的數)和無序區的最後乙個數交換,也就是將該根歸入有序區的最前端;如此重複下去,直至有序區擴充套件至整個記錄區。

具體操作可按下面步驟實現:

1。建大根堆

2。交換根和無序區最後乙個數

3。重建大根堆,因為交換只是使根改變了,所以左右子樹依然分別是大根堆。

4。比較根,左子樹的根和右子樹的根,如果根最大,則無須再作調整,樹已經是大根堆了;如果左子樹的根最大,交換它與根,再遞迴調整左子樹;如果右子樹的根最大,交換它與根,再遞迴調整右子數。

5。遞迴調整到葉子的時候,樹就是大根堆了。

現在還要解決的就是如何建那個初始的大根堆了,把整個陣列r0,r1,...,r(n-1)看成乙個完全二叉樹,只要從後往前依次將以該結點為根的子樹調整為大根堆就行了。而實際上,序號大於[n/2]的結點都是葉子結點,可看作是大根堆,所以只需調整[n/2],[n/2]-1,...,1的結點作為根節點的子樹就可以了。

public static void heapsort(int r)

//迴圈進行交換並重建大根堆

for (int j = r.length - 1; j > 0; j--)

}public static void sift(int r,int ifrom,int ito)

if ((r[j] > temp))

else

}//定位要當初的根結點到正確的位置

r[i] = temp; }00 0

(請您對文章做出評價)

python部落格園 python 模擬部落格園系統

作業 用 模擬系統。專案分析 一 首先程式啟動,頁面顯示下面5內容供使用者選擇 1.請登入 2.請註冊 3.進入文章頁面 5.進入日記頁面 6.進入收藏頁面 7.登出賬號 8.退出整個程式 二 必須實現的功能 1.註冊功能要求 a.使用者名稱 密碼要記錄在檔案中。b.使用者名稱要求 只能含有字母或者...

部落格搬家部落格園

2009年9月的一天,受當時一些 技術名博 的影響,突然想搞乙個獨立網域名稱的技術部落格。於是開始了無比折騰的過程 買網域名稱 買空間,當然,最痛苦的是想乙個自己喜歡 容易記住又未被註冊的網域名稱 選部落格發布系統,在movable type和wordpress之間徘徊很長一段時間之後,選擇了mov...

linux部落格園

學linux已經有一年了,回望走過的路,多謝一下前輩的博文一路指導。收穫很多,言語不盡,謀面的或是未曾謀面的前輩們。多謝你們無私的奉獻,教會了我許多,謝謝!現在我整理出來希望對後輩或是同輩有所幫助吧 駿馬金龍 散盡浮華 barrywang 阿龍along 運維企業架構專案實戰系列 python自動化...