堆和優先佇列的應用

2022-03-15 23:15:17 字數 3160 閱讀 1697

什麼是堆:

堆的定義: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的堆,...