作業系統核心作業排程是優先佇列的乙個應用例項,它根據優先順序的高低而不是先到先服務的方 式來進行排程;
如果最小鍵值元素擁有最高的優先順序,那麼這種優先佇列叫作公升序優先佇列(即總是先刪除最小 的元素),類似的,如果最大鍵值元素擁有最高的優先順序,那麼這種優先佇列叫作降序優先佇列 (即總是先刪除最大的元素);由於這兩種型別是完全對稱的,所以只需要關注其中一種,如昇 序優先佇列.
優先佇列演算法實現:
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 ...