假設我們有乙個陣列int a=,如果把這個陣列看作是完全二叉樹的順序儲存,那麼它對應圖1-1(a)完全二叉樹。
所謂最大堆就是a[i]>=a[2i+1], 且a[i]>=a[2i+2](i在此處對應0~5),這個描述即第四步的結果。也就是說我們把陣列a經過4步調整,最終構建出了它的最大堆,如圖1-1(d)另外需要說明的一點就是最大堆的調整始終是以非葉子結點調整(紅色部分實際上是建立初始堆的核心**)。
**實現:
#include
void print_array(int b,int n)
/*父結點比孩子結點小,把較大的孩子結點值賦給父親結點
*並記住較大的孩子結點下標
*/b[i]=b[j];
i=j;
}/*此處其實是把父結點的舊值賦給值最大的那先前子結點*/
b[i]=temp;
}int main()
;int i;
int len = sizeof(a)/sizeof(a[0]);
/*這個for迴圈實際上就是建立初始堆*/
for(i=(len-1)/2;i>=0;i--)
return 0;
}實際執行結果:只列印了三行,其實主要原因是在i=0時第三次和第四次排序一起做了,
另外:尋找非葉子結點,可以用(陣列長度-1)/2(最靠近葉子結點的父結點),開始逐次遞減,但最終到0(也就是根結點)
以上僅僅只是建立堆的演算法,堆排序演算法是在此基礎上進行的。
堆排序之建初始堆
在牛客網上看到一道題 答案是c,但是之前只接觸插入法建堆,沒了解篩選法建初始堆,於是網上衝浪,查詢了一波解析,於是有了現在這個思路總結 看半天也沒有看到比較靠譜的 然後總結了一下,按照這種思路,能得到c答案,但仍然存在一點疑惑 初始堆難道不應該是大頂堆或者小頂堆嘛,這結果也不是呀,還是說,有什麼定義...
堆排序怎麼建立初始堆 學習筆記 詳解堆排序
堆排序 英語 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆 heap 是電腦科學中一類特殊的資料結構的統稱。堆是一種非線性結構。可以把堆看作乙個陣列,也可以被看作乙個完全二叉...
堆排序前序 堆的建立
什麼是堆 看到上圖這玩意沒,這就是乙個堆,準確的說是個小頂堆,簡單點說小頂堆就是個父節點一定小於子節點的這麼一顆完全二叉樹。那麼大頂堆呢?那當然就是父節點一定大於子節點的這麼一顆完全二叉樹。所以堆就是乙個節點值總是不大於或者不小於父節點值的一顆完全二叉樹。一般我們採用乙個陣列來描述乙個堆,如上圖我們...