堆通常是乙個可以被看做一棵完全二叉樹的陣列物件如果對一棵有n個結點的完全二叉樹的結點按層序編號(從第1層到第 +1層,每層從左到右),則對任一結點i(1<=i<=n),有:
(1)如果i=1,則結點i無雙親,是二叉樹的根;如果i>1,則其雙親是結點。
(2)如果2i>n,則結點i為葉子結點,無左孩子;否則,其左孩子是結點2i。
(3)如果2i+1>n,則結點i無右孩子;否則,其右孩子是結點2i+1。
(4)若對二叉樹的根結點從0開始編號,則相應的i號結點的雙親結點的編號為(i-1)/2,左孩子的編號為2i+1,右孩子的編號為2i+2。
每個結點的值都大於或等於其左右孩子結點的值
每個結點的值都小於或等於其左右孩子結點的值對堆加上以上限制,我們可以作出大頂堆:
f [i
]=f(
i),i
∈[0,
len)
若∃2∗
i+
1 n,則f [i ]>f[ 2∗i+ 1]若∃ 2∗i+ 2 n,則f [i ]>f[ 2∗i+ 2] f[i]=f(i), i\in[0,len)\\ 若\exist 2*i+1f[2*i+1]\\ 若\exist2*i+2f[2*i+2] f[i]=f (i), i∈[0 ,len )若∃2 ∗i+1 n,則f [i]>f[ 2∗i+ 1]若∃ 2∗i+ 2n,則f [i]>f[ 2∗i+ 2]依據以上性質,我們每次有新資料加入陣列,可以從最後乙個非葉子節點即f[l en/2 −1 ]f[len/2-1] f[len/ 2−1] 對陣列進行整理,得到大頂堆。 buildmaxheap (int *num, int len)}if (num[i] < num[ 2*i+2] &&2*i+2 < len)}} } 分類 資料結構 演算法相關 2009 10 15 12 26 2289人閱讀收藏 舉報汗,別人都說大小頂堆只是改改大於號的問題,可我的 從大頂堆只改動大於號調整為小頂堆竟然越界樂,掣肘!後來幾經更改才發現是傳參的問題 見 看來大頂堆改小頂堆不是 亦或是我rp出點問題?搞笑的是 磚頭 c b 竟然對越... 引用 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序的平均時間複雜度為 nlogn 演算法步驟 1.建立乙個堆h 0.n 1 2.把堆首 最大值 和堆尾互換 3.... 首先明確堆是乙個完全二叉樹,小頂堆指根結點的值小於或等於左右子節點的值,大頂堆指根結點的值都大於或等於左右子節點的值 關於大小頂堆的建立更詳細的介紹 include include include include include include include include using names...void
堆排(大頂堆,小頂堆)
Java 堆排序 大頂堆 小頂堆
小頂堆及大頂堆的建立