偽**參考書上的最大堆的最大優先佇列。下面給出實際**(包括最大最小堆和最大最小優先佇列)。
#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...