什麼是堆:
堆的定義:n個元素的序列k=,當且僅滿足條件
(1)ki >= k2i+1 和ki >= k2i+2 (2)ki
<= k2i+1 和ki
<= k2i+2
(1)稱為大根堆 (2)稱為小根堆
可以把堆看成完全二叉樹。
什麼是優先佇列:
優先佇列是一種常見的抽象資料型別,它與"佇列"不同,不遵循"先進先出"原則,而遵循"最小元素先出"原則。
優先佇列的基本操作有三個:
(1) 向優先佇列裡插入乙個元素
(2) 在優先佇列找出最小元素
(3) 刪除優先佇列中最小元素
可以用堆來實現有限佇列
優先佇列的實現:
1 #include "刪除優先佇列的原理為:在最小節點被刪除後,根節點形成乙個空位,這時考慮能否把處在隊中最後位置的節點填入這裡。由於這樣做可能破壞堆序性,所以選擇這個元素與根的兩個子節點中最小的節點填入,選擇的結果可能使得原來的空位向葉節點方向傳遞。如此反覆交換,最終到堆中最後節點小於等於空位的兩個子節點時,將最後節點填入這個空位。stdio.h
"2 #include "
stdlib.h"3
4 typedef int
datatype;56
/********************優先佇列儲存結構********************************/7
struct
priorityqueue 8;
13 typedef struct priorityqueue *pq;
1415
/********************建立優先佇列**********************************
*/16 pq createpq(int
maxnum)
1728}29
return
pq;30}31
32/*
***************************判斷優先佇列是否為空***************************
*/33
intisempty_heap(pq pq)
3437
38/*
*************************往優先佇列中插入元素******************************
*/39
void
add_heap(pq pq, datatype x)
4047
//尋找插入的位置,pq->n是未有元素的空位
48for(i = pq->n; i > 0 && x < pq->element[(i-1)/2]; i = (i - 1)/2)49
52//
插入元素
53 pq->element[i] =x;
54 pq->n++;55}
5657
/*************************在三個元素中,找出最小元素的下標*******************
*/58
int findminindex(pq pq,int index1, int index2, int
index3)
5965
66/*
************************刪除優先佇列最小元素***********************************
*/67
void
removemin_heap(pq pq)
68
8485 minindex =findminindex(pq,endindex,leftchild,rightchild);
86 pq->element[index] = pq->element[minindex];
87if(minindex ==endindex)
88break;89
else
if(minindex ==leftchild)
90 index =leftchild;
91else
if(minindex ==rightchild)
92 index =rightchild;93}
94}9596
9798
/***********************顯示優先佇列中元素的排列***************************
*/99
void
show(pq pq)
100107
108}
109110
intmain()
111
利用堆,可以進行排序:
1測試:/********************對元素進行排序*********************************/2
void sort(datatype * data,int
size)311
12for(i = 0; i < size; i++)
13 printf("
%d,
",removemin_heap(pq));
14 }
1輸出結果:intmain()
2
陣列長度的限制:
棧裡能宣告的最大是1m
也就是char a[n]的大小不能大於1m
堆裡的可以很大
也就是char * a; a=new char [n]的話a的大小可以達2g
優先順序佇列和堆的應用
優先順序佇列可以通過陣列自己維護優先順序,也可以用stl自帶的優先順序佇列priority queue include 大根堆 priority queueque 或 priority queue,less que 小根堆 priority queue,greater que 關於優先順序佇列的應用...
堆的應用 優先順序佇列和堆排
優先順序佇列 就是佇列中的元素是有優先順序的,比如將優先順序最高的放在隊頭,最低的放在隊尾,那麼在對佇列進行操作時,如,出佇列,只能先出優先順序最高的,入佇列,也要根據元素的優先順序,將其放在對應的優先順序處。優先順序佇列的本質就是佇列裡面封裝了堆,具體 如下,下面 用到的堆可參考 pragma o...
堆和優先佇列
學習資料結構的時候就學習過堆,不過忘了很多了,程式設計珠璣 裡也有這一章,因此重新總結一下。堆的兩個性格 1 順序性質 任何結點的值都小於或等於子結點的值。對於最小堆而言 2 形狀性質 二叉樹結構,最多在兩層上具有葉結點,其中最底層的結點盡可能的靠左分布。堆的實現 考慮以陣列實現,對於大小為n的堆,...