什麼是堆:
看到上圖這玩意沒,這就是乙個堆,準確的說是個小頂堆,簡單點說小頂堆就是個父節點一定小於子節點的這麼一顆完全二叉樹。那麼大頂堆呢?那當然就是父節點一定大於子節點的這麼一顆完全二叉樹。
所以堆就是乙個節點值總是不大於或者不小於父節點值的一顆完全二叉樹。
一般我們採用乙個陣列來描述乙個堆,如上圖我們資料儲存即為,那麼父節點的子節點即為 left=parent *2 +1 ,right=left+1 注意,左右節點不一定存在的可能性,算出來的值如果大於陣列長度那麼就不存在此節點。這裡是以陣列索引位為計算值 比如:1這個(0索引位)父節點他的兩個子節點為 第1個和第2個(自己算下嘛)。
小頂堆的構建:
初始資料:3,6,5,2,1,4,7
第一步:我們首先將初始資料直接放入乙個完全二叉樹中(其實就是構建乙個一維陣列)
第二步:採用自下而上的思想,從非葉節點的最後乙個開始,遍歷這個非葉節點的子節點是不是符合小頂堆特性。
為什麼是從非葉節點開始,因為葉節點只有它乙個,無論是小頂堆還是大頂堆它都滿足,所以不用處理。
那麼最後乙個非葉節點是哪個呢,按照完全二叉樹的特性即為(length-1)/2個為最後乙個非葉節點,如上圖所示即為5結點,然後對比其子節點判斷左右節點那個最小,最小節點與父節點進行比較,如果子節點小於父節點那麼進行一次交換。
如上圖所示,第6節點4這個值與父節點進行了一次交換。
第三步:產生交換後,需要以交換的子節點為調整節點,進行一次是否為小頂堆條件判斷,即在進行一次以交換節點為父節點判斷其子節點是否滿足小頂堆的邏輯處理。
然後當所有非葉節點迴圈判斷完成後,此完全二叉樹即為小頂堆。
大頂堆的構建
基本原理在小頂堆中已經講述完畢,對應大頂堆僅僅只是判斷條件變成了父節點要比子節點大,這裡直接用**實現。
public
static
void
createheap
(int
heap)
}//構建大頂堆
public
static
void
siftup
(int i,
int[
] data,
int length)
//如果選擇的子節點大於父節點那麼就交換,然後以交換的節點處,繼續往下調整交換後的堆
if(data[nowindex]
< data[selectchildindex]
)else
}
對應小頂堆的實現,只是換乙個節點大小判斷的改變即可。 堆排序建立初始堆
假設我們有乙個陣列int a 如果把這個陣列看作是完全二叉樹的順序儲存,那麼它對應圖1 1 a 完全二叉樹。所謂最大堆就是a i a 2i 1 且a i a 2i 2 i在此處對應0 5 這個描述即第四步的結果。也就是說我們把陣列a經過4步調整,最終構建出了它的最大堆,如圖1 1 d 另外需要說明的...
堆排序怎麼建立初始堆 學習筆記 詳解堆排序
堆排序 英語 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆 heap 是電腦科學中一類特殊的資料結構的統稱。堆是一種非線性結構。可以把堆看作乙個陣列,也可以被看作乙個完全二叉...
排序 4 堆排序
將待排序的序列構成乙個大頂堆。此時,序列的最大值就是堆頂的根結點。將它移走 就是,將其與堆陣列的末尾元素交換,此時末尾的元素就是最大值 然後將剩餘的n 1個序列重新構成乙個堆,如此反覆。其中關鍵問題 1 如何將無序序列構成乙個堆 2 輸出堆頂元素後,如何調整公升序元素為乙個堆 4.堆排序 堆調整 v...