演算法導論6 5 7習題解答

2021-09-06 02:41:55 字數 2186 閱讀 9700

clrs 6.5-7 :

heap-delete(a, i)操作將結點i中的項從堆a中刪去。對含n個元素的最大堆,請給出時間為o(lgn)的heap-delete的實現。

演算法思想:

對即將被刪的i處的元素設定為堆中末尾的元素,同時堆的大小減1.

此題同時附帶6.2-5的解答

**如下:

1 #include 2

using

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...