大小堆是基於完全二叉樹的結構;
大堆:任意乙個結點的左右孩子的資料都小於此結點的資料,位於堆頂的結點的資料最大。
小堆:任意乙個結點的左右孩子的資料都大於此結點的資料,位於堆頂的結點的資料最小。
下面以小堆為例,**:
以下都是以小堆為例
首先我們只會得到乙個陣列,並且我們知道堆最終形態是完全二叉樹。通過遞迴的思想,如果能把最後乙個以非葉子結點為根的樹變為小堆,然後改變倒數第二個以非葉子結點為根的樹,以此類推就可以將整個樹變為小堆。函式內需要用到向下調整法可看注釋:
void
adjustdown
(pheapstack phs,
int root)
//向下調整法,以phs為根節點的整棵樹變為大小堆
}void
creatheapstack
(pheapstack phs,heap_dt* array,
int arrsz,pcompare compare)
memcpy
(phs->data,array,arrsz*
sizeof
(heap_dt));
phs->sz = arrsz;
phs->dilatation = arrsz;
for(root=
((phs->sz-1-
1)>>1)
;root>=
0;root--
)//得到最後乙個非葉子節點的下標,進行迴圈
adjustdown
(phs,root)
;}
直接往原堆陣列的最後新增乙個元素,然後通過向上調整的方式。對新加的元素,它到根節點這條路上的所有樹都調整符合小堆的特性就好。
void
adjustup
(pheapstack phs,
int root)
}void
insertheap
(pheapstack phs,heap_dt d)
將要刪除的元素與堆陣列最後乙個元素的值交換,然後堆陣列數量減一,現在已經刪除了要刪除的元素,但是因為交換了元素值,小堆的性質被破壞。用向下調整的方法,從原本交換的結點位置開始,將以它為根的樹變為小堆。
void
adjustdown
(pheapstack phs,
int root)
}void
removeheap
(pheapstack phs)
資料結構 大小堆
如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹 的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱這個堆為最小堆 或最大堆 最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵...
資料結構 大小堆的實現及堆排序
堆一般指二叉堆,結構如下 圈內數字指下標,圈外為內容,如圖現在並不能稱為乙個堆,因為它並不滿足大堆也不滿足小堆的組成,下面介紹大堆和小堆的簡答介紹和實現 大堆是指每個父節點的數都大於自己的每個孩子節點的值 用到的演算法是讓大數上移迴圈至完成大堆 void adjustup size t child ...
資料結構 簡單實現優先佇列(維護大小堆)
主要思想是堆排序裡面的維護大 小堆。top一直指向堆頂,而push pop要維護堆,pop出的值是top。注意 大根堆和小根堆只需要堆頂最大 小就行!偽 方法 push 引數 pop 下面引用自 24隻羊 堆和優先佇列 2.1 堆中新增元素和shift up 現在我們要新增元素52,先新增到索引為1...