《data structures and algorithm analysis in c》(資料結構與演算法分析 c語言描述)
作業系統的作業排程需要使用有優先順序的佇列,優先佇列最重要的兩種操作:
插入刪除並返回最小值
實現:陣列模擬的完全二叉樹。
/*
二叉堆:parent (i) < children (2*i,2*i+1)
*/struct heapstruct
;typedef heapstruct *pqueue;
#define min_pq_cap 5
#define min_ele int_min
pqueue init_pq
(int capacity)
pqueue pq =
(pqueue)
malloc
(sizeof
(heapstruct));
pq->capacity = capacity;
pq->size =0;
pq->elements =
(element_type*
)malloc
(sizeof
(element_type)
*(capacity+1)
);// +1
pq->elements[0]
= min_ele;
// e[0]不放元素,作哨兵
return pq;
}void
insert_
(element_type x, pqueue pq)
/* pq->elements[++pq->size] = x; // 在下乙個(保證為完全樹)空閒位置建立空穴,放入x
for(int i=pq->size; (i>>1) > 0; i >>= 1) // 上濾
*/// method 2 避免交換
int i =
++pq-
>size;
for(
; pq-
>elements[i>>1]
> x; i >>=1)
pq->elements[i]
= x;
}element_type delete_min
(pqueue pq)
element_type min_e = pq-
>elements[1]
; element_type last_e = pq-
>elements[pq-
>size--];
int i =
1, child_i;
// last_e從根開始
for(
;(i<<1)
<= pq-
>size; i = child_i)
// 下濾
pq->elements[i]
= last_e;
return min_e;
}void
prin
(pqueue pq)
void
percolate_down
(int i, pqueue pq)
pq->elements[i]
= last_e;
}void
build_heap
(pqueue pq,
int a,
int len)
for(
int i=pq-
>size >>
1; i >
0; i--
)// 從最後乙個非葉子節點開始逆序遍歷
}void
test()
;build_heap
(pq, a,10)
;prin
(pq);}
intmain
(int argc,
const
char
** ar**)
優先佇列《堆》
1.模型 兩個基本操作 insert等價enqueue deletemin刪除最小者 dequeue 2.簡單的實現 1 簡單鍊錶 遍歷刪除min或者排序刪除min 2 使用二叉查詢樹。反覆除去min會使得樹不平衡,並且bst還支援許多不需要的操作。3.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...
優先佇列 堆
印表機列印作業一般是放在佇列中的。如果按照先來先列印的順序,有乙個100頁的列印任務,那麼會讓後面短小的任務等待很長時間。更合理的做法也許是最後處理最耗時的列印任務,不管它是不是最後提交上來的。在多使用者作業系統中,作業系統讓哪個程式使用cpu,是需要決定從佇列裡面選擇的。一般做法是從隊頭獲得程式,...
優先佇列 堆
優先佇列 佇列是乙個操作受限的線性表,資料只能在一端進入,另一端出來,具有先進先出的性質。有時在佇列中需要處理優先順序的情況,即後面進入的資料需要提前出來,這裡就需要優先佇列。優先佇列是至少能夠提供插入和刪除最小值這兩種操作的資料結構。對應於佇列的操作,插入相當於入隊,刪除最小相當於出隊。鍊錶,二叉...