堆的排序主要是2個步驟:(一)構建堆。(二)排序調整堆
△步驟一:需要注意的是,構建堆時,比較的是父節點f和兩個孩子sonl,sonr節點的大小,三個節點中誰的值大,誰坐父節點的位置。
但是sonl或者sonr與父節點f交換位置以後,還要繼續調整sonl或者sonr與父節點交換位置後的子樹
舉例:(假設sonr與父節點f交換了位置,但此時的f節點不一定是其子樹中的最大值,故需要繼續調整)
△步驟二:重複迴圈乙個過程:交換排序->調整堆->交換排序->調整堆->...
不過需要注意一點:交換排序後的元素不再參與調整堆的佇列中
原文出處:
點選這裡
#includeusing namespace std;
//大頂堆
templatevoid heapadjust(type *array,int i,int size)
if(rchild<=size && array[rchild] >array[max])
if(max!= i) //如果發生交換,重新調整堆
}}templatevoid heapsort(type *array,int len)
for(int i=len/2-1;i>=0;--i) //建立初始堆,從非葉子節點開始調整。
for(int i=len-1;i>=0;--i)//從最後乙個元素開始,與堆頂元素交換(此時是大頂堆,大元素依次交換到後面有序陣列) }
void main()
; heapsort(a,8);
for(int i=0;i<8;++i)
資料結構之堆排序
在資料結構中,堆排序是非常重要的乙個知識點,尤其像在期末考試 考研等計算機考試中經常會考察堆排序,並要求畫出示意圖.下面主要通過一道考研題目講述堆排序的知識,希望對大家有所幫助.文章內容參考嚴蔚敏的 資料結構 王道論壇的 資料結構 和自己的一些理解 參看動態圖 堆排序是一種樹形選擇排序方法,它的特點...
資料結構之堆排序
堆排序就是利用堆 本文利用大頂堆 進行排序的方法。它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。它的基本思想是,將待排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的根結點。將它移走 就是將它與堆陣列的末尾元素交換,此時末尾元素就是最大值...
資料結構之堆排序
堆具有完全二叉樹的性質 每個結點大於等於左右孩子的堆稱為大頂堆,或每個結點小於或等於左右孩子的堆稱為小頂堆。堆排序 將待排序的序列構建成乙個大頂堆,此時,最大值在整個堆的根結點。將它移走 其實就是將它與堆陣列的末尾元素交換,此時末尾元素就是最大值 然後將剩餘的n 1個序列重新造成乙個,這樣會得到n個...