話不多說,先上**
#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 ...