堆是一棵完全二叉樹,所以可以利用陣列來實現。
以1號作為root,則對於陣列中的任意乙個i,其左兒子在(2*i),右兒子在(2*i+1),父親在(i/2)。
下面以最小堆為例,實現一些基本操作:
#define inf 0x3f3f3f3f
#define max 1005
int heap[max];
heap[0] = -inf;
int size = 0;
//比較父節點與子節點,若父節點大,則交換,實現子節點的上濾
void percolateup(int p)
else break;
}}
//將左右兩個兒子節點與父節點比較,若父節點大,下濾(與兒子節點交換)
void percolatedown(int p)
else if(heap[p*2 + 1] < heap[p])
else return;
}}
將元素先插入到末尾的下乙個位置(保證為完全樹),然後逐層上濾,尋找正確的位置。
每一次上濾都需要反覆交換,但是縱觀整個過程,會發現每一步只需要將不滿足條件的父親下移,當找到正確的位置之後,再進行一步交換即可。
如果插入的元素是整個堆的最小值,則x會被一直推到堆頂。此時x大於heap[0](-inf),迴圈終止,交換。
void insert(int x)
//刪除堆頂的最小元,之後將最後乙個節點放到1號位置,然後percolatedown,進行調整,保持完全樹
int deletemin()
heap[i] = lastelem;
return minelem;
}
堆(優先佇列,最大堆的基本操作,堆的例題)
1 堆 優先佇列 是一種特殊的 佇列 取出元素的順序是 依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序。2 堆的特性 1 結構性 用陣列表示的完全二叉樹 堆一定是完全二叉樹 2 有序性 任一結點的關鍵字是其子樹所有結點的最大值 或最小值 最大堆 maxheap 也稱 大頂堆 任一結點的...
優先佇列基本操作
了解完佇列之後我們來了解一種特殊的佇列 優先佇列 優先佇列是一種特殊的佇列,相較於佇列它的特殊也是功能最強大之處在於能自動排序。include using namespace std 命名空間不是標頭檔案 優先佇列宣告的基本格式是 priority queue 結構型別 佇列名 例 priority...
優先佇列(堆)的基本結構(1)
摘要 優先佇列是指的佇列可以提高最高優先順序的資訊,並且它的刪除與插入操作都可以保證這個結構不被破壞 1 基本資料結構 由乙個代表堆大小的變數,堆容量的變數,還有乙個可以動態分配的陣列.2 陣列的第乙個元素不用,編號從1開始.該佇列可以看成一棵二叉樹,父節點總是比子節點要小.同時堆是乙個被完全填滿的...