用堆實現優先佇列

2022-04-27 18:35:03 字數 1074 閱讀 2155

話不多說,先上**

#include 

#include

//定義乙個堆得結構體,

struct myheap

;//調整資料,維持堆得性質,這個和上次heapify的作用一樣

//只是這個時從子道父節點這樣的判斷而已。

int increasekey(myheap* pheap, int npos)

else

//否則堆沒有被破壞,退出迴圈

}return1;}

//插入資料,這裡pnheap為要插入的隊,nlen為當前堆得大小。

//ndata為要插入的資料,這裡注意報保證堆得空間足夠。

int insert(myheap* pheap, int ndata)

//彈出堆中對大元素,並使堆得個數減一

int popmaxheap(myheap* pheap)

pheap->pndata[npos] = ntemp;

npos = nchild;

nchild *= 2;

}//最好乙個用最末尾的填充。

pheap->pndata[npos] = pheap->pndata[pheap->nsize];

--pheap->nsize; //堆個數量減一

return nmax; //返回最大值。

}//程式入口main

int main()

for (int i = 1; i <= 10; ++i) //測試優先佇列是否建立成功

printf("\n");

while (myheap.nsize > 0) //逐一彈出佇列的最大值。並驗證

printf("\n");

::free(myheap.pndata); //最後不要忘記釋放申請的空間

system("pause");

return

0;}

其實用堆實現佇列就是用完全二叉樹的應用過程,如果對完全二叉樹以及堆排序有比較紮實的基礎知識,再加上網上的查詢的資料,實現優先佇列還是不難的。

用堆實現優先佇列

堆的性質 1.乙個是他是乙個陣列 當然你也可以真的用鍊錶來做。2.他可以看做乙個完全二叉樹。注意是完全二叉樹。所以他的葉子個數剛好是nsize 2個。3.我使用的下標從1開始,這樣好算,如果節點的位置為i,他的父節點就是i 2,他的左孩子結點就是i 2,右孩子結點就是i 2 1,如果下標從0開始,要...

用堆實現優先順序佇列

申明 要用到堆的基本操作 鏈結為 typedef struct priorityqueue priorityqueue 優先順序佇列初始化 void priorityqueueinit priorityqueue q,compare com 向佇列中插入元素 void priorityqueuepu...

用二叉堆實現優先佇列 Priority Queue

優先佇列出隊跟佇列一樣,從隊首出隊 但隊內的次序由優先順序決定,即優先順序高的資料項可以插隊,排到前面。二叉堆能夠將優先佇列的入隊和出隊複雜度都保持在o logn 完全二叉樹,如果用順序表來表示的話,設根節點下標為1,若某節點下標為p,則其左子節點下標為2p,右子節點下標為2p 1,父節點下標為p ...