資料結構與演算法 堆 的優先佇列

2022-06-03 16:48:12 字數 3110 閱讀 7413

作業系統核心作業排程是優先佇列的乙個應用例項,它根據優先順序的高低而不是先到先服務的方 式來進行排程;

如果最小鍵值元素擁有最高的優先順序,那麼這種優先佇列叫作公升序優先佇列(即總是先刪除最小 的元素),類似的,如果最大鍵值元素擁有最高的優先順序,那麼這種優先佇列叫作降序優先佇列 (即總是先刪除最大的元素);由於這兩種型別是完全對稱的,所以只需要關注其中一種,如昇 序優先佇列.

優先佇列演算法實現:

1 #include 2 #include 3 #include 45

#define default_capcity 128

6#define isless(a,b) (a7

8 typedef int

datatype;

910 typedef struct

_priorityqueue

11priorityqueue;

1617

bool init(priorityqueue &pq, int *orginal, int

size);

18bool push(priorityqueue &pq, datatype value);

19bool pop(priorityqueue &pq, datatype &value);

20bool isempty(priorityqueue &pq);

21bool isfull(priorityqueue &pq);

22void destroy(priorityqueue &pq);

23static

void build(priorityqueue &pq);

24static

void adjustdown(priorityqueue &pq, int

index);

25static

void adjustup(priorityqueue &pq, int

index);

2627

/*初始化優先佇列

*/28

bool init(priorityqueue &pq, datatype *orginal, int

size)

2945

return

true;46

}4748/*

銷毀優先順序佇列

*/49

void destroy(priorityqueue &pq)

5053

54/*

優先佇列是否為空

*/55

bool isempty(priorityqueue &pq)

5660

61/*

優先佇列是否為滿

*/62

bool isfull(priorityqueue &pq)

6367

68int size(priorityqueue &pq)

6972

73/*

從最後乙個父節點(size/2-1 的位置)逐個往前調整所有父節點(直到根節

74點), 確保每乙個父節點都是乙個最大堆,最後整體上形成乙個最大堆

*/75

void build(priorityqueue &pq)

7682}83

84/*

將當前的節點和子節點調整成最大堆

*/85

void adjustdown(priorityqueue &pq, int

index)

86102

103//

判斷最大的節點是否大於當前的父節點

104if

(isless(pq.arr[child], cur))

105109

else

110115

}116

}117

118/*

將當前的節點和父節點調整成最大堆

*/119

void adjustup(priorityqueue &pq, int

index)

120126

while(index>0

)127

139else

140144

}145

else

146150

}151

}152

153/*

刪除優先佇列中最大的節點,並獲得節點的值

*/154

bool pop(priorityqueue &pq, datatype &value)

155165

166/*

優先佇列中插入節點

*/167

bool push(priorityqueue &pq, datatype value)

168174

int index =pq.size;

175 pq.arr[pq.size++] =value;

176adjustup(pq, index);

177return

true

;178

}179

180int main(void

) 181

;184

int i = 0

;185

186if(!init(pq, task, sizeof(task)/sizeof(task[0

])))

187191

192for (i = 0; i)

193196

197//

堆中插入優先順序為 88 的任務

198 push(pq, 88);//

堆中元素出列

199 printf("

按照優先順序出列:\n");

200datatype value;

201202

while

( pop(pq, value))

203206

destroy(pq);

207208 system("

pause");

209return0;

210 }

資料結構與演算法 複習 堆 優先佇列

插入演算法 該演算法從優先佇列的序列去觀察,比較直觀。首先把要插入的元素放在隊尾temp裡。從佇列的最後乙個元素,逐次向前尋找父節點,空位隨之移動,當到達隊頭,或者當前元素小於temp元素時,即可插入。刪除演算法 刪除最小元素,也就是最頭的元素。當我們利用 當前元素數量 1 這樣的操作刪除元素後,最...

資料結構 堆(優先佇列)

一種樹形資料結構,分大根堆,小根堆。大根堆 max heap 滿足所有父節點不小於其任意子節點。小根堆 min heap 滿足所有父節點不大於其任意子節點。在這裡,我們只考慮二叉堆。二叉堆是一棵完全二叉樹。solution 可見,每堆果子分別被合併了n 1次,n 2次,n 3次 1次 則數量越小的堆...

資料結構 優先佇列(堆)

什麼是堆 堆是一棵具有特定性質的二叉樹 堆的基本要求是堆中所有節點的值必須大於等於 或者小於等於 其孩子節點的值 堆應該是一棵完全二叉樹 堆的表示 由於堆在形式上是一棵完全二叉樹,所以用陣列不會浪費儲存空間 public class heap private int ary private int ...