首先介紹一下堆,它是一種經過排序的完全二叉樹,其中任一非葉子節點的大小都不大於(或不小於)其左右兒子的值。
最小堆:即任一非葉子節點的值都不大於其左右孩子的值,乙個最小堆如下圖:
首先介紹最小堆的插入操作,
void push(int e)
///最小堆元素的放入
void ****up(int s,int e)
heap[s]=heap[parent];
s=parent;
}heap[s]=e;
}///給堆中加入元素
void ****down(int s,int e
先每次在陣列的最後位置加乙個新的位置,size值加1,執行插入時,由這個新的位置往上找,找到乙個要新增的元素比該位置的父節點要大的位置,然後這個位置即是新元素的位置。在訊位置的同時不斷把不合條件的點往下移,這樣維護了最小堆的結構特點。
最小堆的元素出堆操作:
int pop()
int ret=heap[0];
int s=--size;
****down(0,heap[s]);
heap[s]=0;
return ret;
}///資料出堆
void ****down(int s,int e)
if(e
最大堆:既然知道了最小堆,那麼最大堆和最小堆都一樣,就是符號不同而已
最小堆與最大堆
wang 程式設計日記三 最小堆最小堆的實質是把樹儲存在乙個陣列,在陣列中,非葉結點的左子樹在陣列中的下標 設為x 該結點在陣列中的下標 2 1 那麼x 1就是該結點的右子樹.相反的如果某結點在陣列中的下標為x,那麼其父結點為 x 1 2。在乙個單個的結點a和其左右子樹b.c中,把其中最小的值賦給結...
最小堆與最大堆
最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。最小堆 根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。上圖 通常來說,最小堆用於排序找到一堆資料裡面的最小的。因為最小值一定會上浮到根結點。通常用於優先佇列。定時器...
最大堆 最小堆
堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...