CLRS 6 5優先佇列

2021-07-04 16:07:18 字數 3208 閱讀 2147

偽**參考書上的最大堆的最大優先佇列。下面給出實際**(包括最大最小堆和最大最小優先佇列)。

#include 

#include

#include

#include

using

namespace

std;

#define parent(i) ((i-1)/2)

#define left(i) (2*i+1)

#define right(i) (2*i+2)

void max_heapify(vector

&heap, int heap_size, int i)

}void build_max_heap(vector

&heap)

void max_heap_sort(vector

&heap)

}int heap_maximum(vector

&heap)

int heap_extract_max(vector

&heap)

void heap_increase_key(vector

&heap, int i, int key)

*/while (i > 0 && key > heap[parent(i)])//更改書中**,詳見練習6.5-6

heap[i] = key;

}void max_heap_insert(vector

&heap, int key)

void min_heapify(vector

&heap, int heap_size, int i)

else

break;

}}void build_min_heap(vector

&heap)

void min_heap_sort(vector

&heap)

}int heap_minimum(vector

&heap)

int heap_extract_min(vector

&heap)

void heap_decrease_key(vector

&heap, int i, int key)

}void min_heap_insert(vector

&heap, int heap_size, int key)

int main()

; min_heap_sort(array);

for (auto n : array)

cout

<< n << ' ';

cout

<< endl;

cout

<< heap_minimum(array) << endl;

cout

<< heap_extract_min(array) << endl;

for (auto n : array)

cout

<< n << ' ';

cout

<< endl;

heap_decrease_key(array, 5, -100);

for (auto n : array)

cout

<< n << ' ';

cout

<< endl;

min_heap_insert(array, 15, 2);

for (auto n : array)

cout

<< n << ' ';

cout

<< endl;

return

0;}

6.5-4

為了保證heap_increase_key中原先的關鍵字小於將要被增加的值。

6.5-5

初始化:沒增值之前滿足最大堆性質,a[

i]增加之後唯一破壞性質的只可能是 a[

i]>a[

pare

nt(i

)];

保持:交換 a[

i]和 a[

pare

nt(i

)]之後,唯一破壞性質的只可能是 a[

pare

nt(i

)]>a[

pare

nt(p

aren

t(i)

)],改變 i=

pare

nt(i

) 保持迴圈不變數;

終止:當迴圈終止時 i=

1 或者 a[

i]pare

nt(i

)],當 i=

1 時 a[

pare

nt(i

)]不存在,而 a[

i]pare

nt(i

)]時不破壞堆的性質。

6.5-6

修改while條件判斷,同時將原heap_increase_key的第五行改為 a[i] = a[parent(i)]。然後新增第七行 a[i] = key 即可。可參考6.5-3中的heap_increase_key**。

6.5-7

假如我們使用的是最大優先佇列,對於先進先出佇列,我們將第乙個關鍵字設為最大,每次插入的時候將關鍵字依次減小。棧則相反。

6.5-8

偽**如下:

heap-delete(a, i):
a[i] = a[a.heap-size]

a.heap-size -= 1

max-heapify(a, i)6.5-9

1) 在每乙個鍊錶中取出第乙個值,然後把它們放在乙個大小為

k 的陣列裡,然後把這個陣列建成乙個最小堆。此步驟的時間複雜度為 o(

k); 2) 取出堆中的最小值,然後把該最小值所處的鍊錶的下乙個值放入堆中並調整堆。如果鍊錶中有乙個已經為空(元素已經都被取出),則改變堆的大小。此步驟的時間複雜度為o(

lgk) ;

3) 不斷的重複步驟二,直到所有的鍊錶都為空。

CLRS 10 1棧和佇列

第乙個棧從 1 到 n增長,第二個棧從 n 到 1遞減,只有當兩個棧指標相鄰時再入棧才會溢位 10.1 3 圖略,在此只給出q.head和q.tail。初始 q.head q.tail 1 enqueue q,4 q.head 1 q.tail 2 enqueue q,1 q.head 1,q.ta...

優先佇列(3道優先佇列問題)

優先佇列是一種十分強大的資料結構,它保持了一種動態的有序性,對於不斷改變有入隊的操作,而又需要某種最大或最小的操作的問題是再合適不過了,通常優先佇列的實現是由最小堆或者最大堆完成的,並通過堆排序保持佇列的有序性,模擬佇列的結構,在實際比賽中要寫乙個堆排序還是要一定的時間的,但是stl中queue容器...

佇列以及優先佇列

1.佇列 佇列的定義 標頭檔案 include 佇列是一種先進先出的資料結構 佇列的宣告 queueq 宣告字元型別 queueq 宣告結構體型別 以及可以宣告一些自定義的型別 佇列的操作 入佇列 s.push x 出佇列 s.pop 返回佇列的資料數量 s.size 判斷佇列是否為空 s.empt...