clrs 6.5-7 :
heap-delete(a, i)操作將結點i中的項從堆a中刪去。對含n個元素的最大堆,請給出時間為o(lgn)的heap-delete的實現。
演算法思想:
對即將被刪的i處的元素設定為堆中末尾的元素,同時堆的大小減1.
此題同時附帶6.2-5的解答
**如下:
1 #include 2using
namespace
std;3//
修正i的位置,在此處已經假設i的子節點都是堆
4static
void max_heapify(int*&a, int i, int
length);5//
建立陣列的堆
6void build_max_heap(int*&a, int
length);7//
利用堆對陣列重新排序,總是拿第乙個和最後乙個對調,陣列長度減一
8void heap_sort(int*&a, int
length);9//
刪除ith元素
10void heap_delete(int*&a, int i, int
length);
11//
插入x12
void heap_insert(int*&a, int x, int
length);
13//
將ith位置上的數增加到key
14void increase_key(int*&a, int i, int
key);
1516
intmain()17;
20int* a = new
int[len];
21for(int i =0; i < len; i++)
22 a[i] =b[i];
23heap_sort(a, len);
24for(int i =0; i < len; i++)
25 cout26 cout<<"
****
"<2728 increase_key(a, 7, 100
);29
heap_sort(a, len);
30for(int i =0; i < len; i++)
31 cout32 cout<<"
****
"<3334 heap_insert(a, 10
, len);
35 heap_sort(a, len + 1
);36
for(int i =0; i < len + 1; i++)
37 cout38 cout<<"
****
"<3940 heap_delete(a, 1, len + 1
);41
heap_sort(a, len);
42for(int i =0; i < len; i++)
43 cout44 cout<<"
****
"<45return0;
46}4748
static
void max_heapify(int*&a, int i, int
length)
4958
if(right <= length -1&& a[right] >a[largest])
61if(largest !=temp) else68}
69}7071
void build_max_heap(int*&a, int
length)
7277
78void heap_sort(int*&a, int
length)
7987}88
89void heap_delete(int*&a, int i, int
length)
9095}96
97void heap_insert(int*&a, int x, int
length)
98108
109void increase_key(int*&a, int i, int
key)
110 else
123}
124 }
演算法導論習題解答 2 3 7
2.3 7 請給出乙個執行為 nlgn 的演算法 偽碼 使之能在給定乙個由n 個整數構成的集合s 和另乙個整數x 時,判斷出s 中是否存在有兩個其和等於x 的元素。解 解題思路 先對集合s進行歸併排序,然後新建乙個陣列s1,使得s1 i x s i 再將兩個陣列並起來。如果在並的過程中發現有兩個元素...
演算法導論12 2節習題解答
clrs 12.2 1 c錯,240及240之後的節點應該都為911左子樹上的節點,那麼所有節點必然小於或等於911,但點912明顯違反了。clrs 12.2 2 search minimum x if left x nil search minimum left x return x search...
演算法導論8 2 4習題解答 計數排序
clrs 8.2 4 在o 1 的時間內,回答出輸入的整數中有多少個落在區間 a.b 內。給出的演算法的預處理時間為o n k 演算法思想 利用計數排序,由於在計數排序中有乙個儲存數值個數的臨時儲存區c 0.k 利用這個陣列即可。include iostream using namespace st...