堆(優先佇列)的基本操作

2021-08-13 14:02:27 字數 999 閱讀 6836

堆是一棵完全二叉樹,所以可以利用陣列來實現。

以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開始.該佇列可以看成一棵二叉樹,父節點總是比子節點要小.同時堆是乙個被完全填滿的...