優先佇列(堆)

2021-10-09 05:23:35 字數 1986 閱讀 6129

《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,是需要決定從佇列裡面選擇的。一般做法是從隊頭獲得程式,...

優先佇列 堆

優先佇列 佇列是乙個操作受限的線性表,資料只能在一端進入,另一端出來,具有先進先出的性質。有時在佇列中需要處理優先順序的情況,即後面進入的資料需要提前出來,這裡就需要優先佇列。優先佇列是至少能夠提供插入和刪除最小值這兩種操作的資料結構。對應於佇列的操作,插入相當於入隊,刪除最小相當於出隊。鍊錶,二叉...