在《演算法設計技巧與分析》這本書的第四章,介紹了堆。於是按照上面的偽**實現了一下。
資料結構定義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 這裡來說明一下滿二叉樹的概念與完全二叉樹的概念。滿二叉樹 除了葉子節點,所有的節點的左右孩子都不為空,就是一棵滿二叉樹,如下圖。可以看出 滿二叉樹所有的節點都擁有左孩子,又擁有右...