STL原始碼 heap最大堆,最小堆

2021-06-27 01:58:52 字數 1386 閱讀 4714

最大堆和最小堆都是一棵完全二叉樹。

最大堆:是指根節點的關鍵字值是堆中的最大關鍵字值,且每個節點若有兒子節點,其關鍵字值都不小於其兒子節點的關鍵字值。

最小堆:是指根節點的關鍵字值是堆中的最小關鍵字值,且每個節點若有兒子節點,其關鍵字值都不大於其兒子節點的關鍵字值。

步驟:

把當前節點數i設定為已知堆的節點數加1即i=++(*n),即新增的元素放在最下一層作為新的葉子節點。求出節點i的父節點parent=i/2;判斷是否為空堆,並比較所插入元素與父節點關鍵字值的大小;

若所插入節點關鍵字值大於父節點關鍵字值即item>heap[parent],則把父節點向下移,並把父節點作為當前節點,依次求父節點,即依次沿著樹枝向上延伸;

把元素item插入到正確位置;

最大堆的刪除,即刪除最大的元素。我們先取最後的元素提到根結點,然後刪除最大值,然後再把新的根節點放到合適的位置。

#include #include #define max_size 10  

int heap[max_size];

/*最大堆的插入操作*/

/*注:堆的下標是從1開始,而不是0*/

void max_heap_insert(int *heap,int *n,int item)

i=++(*n);

parent=i/2;

while((i!=1) && (item>heap[parent]))//若堆為非空,且所插入資料item大於父節點的關鍵字值

heap[i]=item;//插入到正確的位置

} /*最大堆的刪除操作*/

int max_heap_delete(int *heap,int *n)

item=heap[1];//把最大堆的最大元素賦給item

temp=heap[(*n)--];//堆的最後節點關鍵字值

parent=1;

child=2*parent;

while(child<=(*n)) //《迴圈次數的限制

} heap[parent]=temp;//插入到正確位置

return item;//返回刪除的關鍵字值

} int main()

{ int item,i;

int n=0;

for(i=1;i1 2 32 12 55 334 7 23 7 67

334 32 55 23 12 2 7 1 7

the deleted data is:334

55 32 7 23 12 2 7 1

STL原始碼解析之heap

include include include heap algorithms using namespace std heap的所有元素都必須遵循特別的完全二叉樹排列規則,所有heap不提供遍歷功能,也不提供迭代器 int main vectorivec ia,ia 9 for int i 0 i...

最小最大堆

include include include include define max size 100 define swap x,y,t t x x y y t typedef struct element element heap max size void min max insert ele...

最大堆 最小堆

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...