用堆實現優先佇列

2021-06-06 05:29:48 字數 1408 閱讀 6658

堆的性質:

1.乙個是他是乙個陣列(當然你也可以真的用鍊錶來做。)。

2.他可以看做乙個完全二叉樹。注意是完全二叉樹。所以他的葉子個數剛好是nsize / 2個。

3.我使用的下標從1開始,這樣好算,如果節點的位置為i,他的父節點就是i/2,他的左孩子結點就是i*2,右孩子結點就是i*2+1,如果下標從0開始,要複雜一點。

4.他的父節點一定不比子節點小(我所指的是最大堆)。

由這些性質就可以看出堆得一些優點:

1.可以一下找到最大值,就在第乙個位置heap[1].

2.維持堆只需要log(2,n)(n是資料個數)的複雜度,速度比較快。他只需要比較父與子之間的大小關係,所以比較次數就是樹的高度,而他是乙個完全二叉樹,所以比較次數就是log(2,n)。

具體實現:

具體實現就看看源**吧!努力地組織了一下,呵呵,希望能看懂,奉上源**:

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

struct myheap

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

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

int increasekey(myheap* pheap, int npos)

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

}return 1;

}//插入資料,這裡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;

}

用堆實現優先佇列

話不多說,先上 include include 定義乙個堆得結構體,struct myheap 調整資料,維持堆得性質,這個和上次heapify的作用一樣 只是這個時從子道父節點這樣的判斷而已。int increasekey myheap pheap,int npos else 否則堆沒有被破壞,退...

用堆實現優先順序佇列

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

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

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