資料結構與演算法 堆

2022-01-28 22:22:54 字數 2352 閱讀 3855

在《演算法設計技巧與分析》這本書的第四章,介紹了堆。於是按照上面的偽**實現了一下。

資料結構定義maxheap.hpp如下,

1 #ifndef max_heap_hpp_

2#define max_heap_hpp_

34 #include

5using std::vector;67

class maxheap

8 ;23

24#endif

實現maxheap.cpp如下

1 #include "

maxheap.hpp"2

3 #include

4 #include

5using std::vector;

6using std::cout;

7using std::endl;

89 maxheap::maxheap(vector& a)

10 22 }

2324

void maxheap::siftup(int i)

25 37

else

38break;

39 i = i>>1;

40if(i==1)

41break;

42 }

43 }

4445

void maxheap::siftdown(int i)

46 61

else

62break;

63if((i<<1)>array.size()-1)

64break;

65 }

66 }

6768

void maxheap::insert(int x)

69 73

74void maxheap::delete(int i)

75 87

88int maxheap::deletemax()

89 94

95void maxheap::sort()

96 105 array = sortedarray;

106 }

107108

void maxheap::print()

109

最後的測試主程式main.cpp如下:

1 #include "

maxheap.hpp"2

3 #include

4 #include

5using std::vector;

6using std::cout;

7using std::endl;89

int main()

10 ;

12int d = ;

13 cout << "

original array:

"<< endl;

14for(int i=0;i<10;i++)

15 cout << "\t"

<< d[i];

16 cout << endl;

17 vector a(d,d+sizeof(d)/sizeof(int));

18 maxheap b(a);

19 b.print();

2021 b.sort();

22 cout << "

sorted array:

"<< endl;

23 b.print();

2425

return

0;26 }

最後的測試結果實現了降序排序。

其實網上已經有很多實現的**了,自己實現一下,鍛鍊一下。

比較自己的**和網上已經實現的**(如自己在maxheap裡面用了乙個vector,網上一般是用乙個陣列指標結合size實現。

在堆排序的實現中,呼叫siftdown(h[1..j-1],1),如果資料結構裡面用的是陣列指標,那麼是很好傳遞引數的,siftdown(array_start,array_length,down_index)三個引數,分別是陣列起始位置(這裡是位置,不是位址,因為陣列指標已經在資料結構裡面了),陣列長度,和要調整的元素位置。而我在資料結構裡面使用的vector,這裡就不是很好辦了,如果要指定只取前j-1個元素,或許需要借助另外乙個vector,進行兩次複製,這就太浪費了。最後勉強使用deletemax,每次把最大的元素挑出來,然後實現排序,效率肯定沒有直接呼叫siftdown(h[1..j-1],1)好了。

資料結構的定義相當關鍵,會影響到函式的實現和呼叫方式,影響到程式的效率。

vector雖然很好用,但是也不能濫用。

網上經典的資料結構和演算法的實現,應該多學習學習。

資料結構與演算法 堆結構

1 本質 一顆特殊的樹。2 特性 3 分類 對於每乙個節點的值都大於等於子節點的值的情況,該堆被稱為大頂堆。對於每乙個節點的值都小於等於子節點的值的情況,該堆被稱為小頂堆。4 儲存方式 對於完全二叉樹而言,陣列儲存方式是最節省記憶體的。5 插入節點的時間複雜度 將節點插入到靠左的底層作為新的葉子節點...

資料結構與演算法 堆

堆 完全二叉樹,高度為o lgn 基本操作至多和樹的高度成正比,構建堆的時間複雜度是o n 堆是一顆完全二叉樹,假設有n個節點,樹高h log2 n 證明方法如下 1 假設根節點的高度為0,葉子節點高度為h,每層包含元素個數為2 x,x 從0 到h。2 構建堆的過程是自下而上,對於每層非葉子節點需要...

資料結構與演算法 堆

堆的乙個經典的實現是完全二叉樹 complete binary tree 這樣實現的堆稱為二叉堆 binary heap 這裡來說明一下滿二叉樹的概念與完全二叉樹的概念。滿二叉樹 除了葉子節點,所有的節點的左右孩子都不為空,就是一棵滿二叉樹,如下圖。可以看出 滿二叉樹所有的節點都擁有左孩子,又擁有右...