堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹結構。
堆結構的二叉樹儲存:
大堆:每個父節點的都大於孩子節點;小堆:每個父節點的都小於孩子節點。
建堆:由於堆被視為完全二叉樹,故在h-1層找到第乙個(從後往前找)非葉子結點,進行堆的下調
建大堆時,從下往上依次判斷並調整堆,使該結點的左右子樹都滿足大堆
建小堆時,從下往上依次判斷並調整堆,使該結點的左右子樹都滿足小堆
可見大堆的建立與小堆的建立方式類似,下面以大堆進行討論。
利用vactor模板儲存堆中元素
templateclass heap
;
實現堆的建立
templateheap::heap()
:_a(null)
{}templateheap::heap(const t* a, size_t size)
堆的第乙個非葉子結點的陣列下標時((size-1)-1)/2(最後乙個結點是size-1)
for (int i = (int)(size - 2) / 2; i >= 0; --i)//不能定義為size_t(無符號)
//建小堆,類似建大堆的方式,從下向上進行調整堆,使該結點處的左右子樹都滿足小堆
//在進行調小堆時,也通過下調實現
}//下調--建大堆/小堆
templatevoid heap::_adjustdown(size_t parent)
if (_a[child] > _a[parent])//如果子結點大於父親結點就交換,否則就要跳出迴圈
else
}}//在建立小堆時,只需要將比較條件進行改變就可以實現
在已經是大堆或小堆的堆中加入元素使堆仍為大堆,可通過該元素與它的父結點進行比較
ps:由於插入的元素在陣列末尾,故需要通過上調進行比較實現堆的大堆或小堆
templatevoid heap::_adjustup(size_t child)//上調
else
}}templatevoid heap::push(const t& x)//元素x入堆
堆中pop元素,刪除堆頂元素,使堆仍為大堆。
在已經是大堆或小堆的堆中刪除堆頂元素,直接刪除堆頂元素,造成無法進行大堆或小堆的實現,可通過將第乙個元素與最後乙個元素進行交換,然後刪除最後乙個元素,最後通過下調實現大堆或小堆
templatevoid heap::pop()//出堆
實現堆的堆頂,判空及堆元素個數
templatet& heap::gettop()//訪問堆頂元素
templatebool heap::empty()//判空
templatesize_t heap::size()//堆元素個數
templatevoid heap::printheap()
cout << endl;
}
測試用例
#include"heap.hpp"
void test4()
; heaph(arr, sizeof(arr) / sizeof(arr[0]));
h.printheap();
cout << "empty: " << h.empty() << endl;
cout << "size: " << h.size() << endl;
cout << "gettop: " << h.gettop() << endl;
h.push(20);
h.printheap();
h.pop();
h.printheap();
}
如果對於上述說明還是不是很清楚,可自己親手畫圖分析,存在不足之處請多多指教。
【vector】包含著一系列連續儲存的元素, 其行為和陣列類似。訪問vector中的任意元素或從末尾新增元素都可以在常量級時間複雜度內完成,而查詢特定值的元素所處的位置或是在vector中插入元素則是線性時間複雜度。
本文出自 「scen」 部落格,請務必保留此出處
小頂堆及大頂堆的建立
首先明確堆是乙個完全二叉樹,小頂堆指根結點的值小於或等於左右子節點的值,大頂堆指根結點的值都大於或等於左右子節點的值 關於大小頂堆的建立更詳細的介紹 include include include include include include include include using names...
堆的實現及用途
大頂堆 每個結點的值都大於或等於其左右孩子結點的值。小頂堆 每個結點的值都小於或等於其左右孩子結點的值。注 本節以小頂堆為例,記堆的大小為n。首先定義乙個堆。class heap void push int x void pop int top int size bool empty 從當前結點開始...
堆的建立及基礎操作
建立乙個堆 void creatheap heap hp,int array,int size hp capacity size 搬移 for i i size size hp size size 找數的倒數第乙個非葉子結點 int last size 2 1 最後乙個結點是size 1,雙親就是再...