堆實際上是一棵完全二叉樹,其任何一非葉節點滿足性質:
key[i]<=key[2i+1]&&key[i]<=key[2i+2]或者key[i]>=key[2i+1]&&key>=key[2i+2]
即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。
堆分為大頂堆和小頂堆,滿足key[i]>=key[2i+1]&&key>=key[2i+2]稱為大頂堆,滿足 key[i]<=key[2i+1]&&key[i]<=key[2i+2]稱為小頂堆。由上述性質可知大頂堆的堆頂的關鍵字肯定是所有關鍵字中最大的,小頂堆的堆頂的關鍵字是所有關鍵字中最小的。
//這裡用到了仿函式思想
//由於本人的編譯整合環境沒有greater,故根據庫中less,模仿改寫了乙個greater
//仿函式的好處,可以提公升**的復用率,將相反的邏輯用仿函式標記出來即可
//採用的思想是向下調整演算法
//並借助庫中的vector來模擬堆的空間
#pragma once
#include
#include
using
namespace
std;
#include
#include
template
struct greater
: public binary_function<_ty, _ty, bool>
};template
<>
struct greater
};template
//仿函式,預設堆
class heap//heap
heap(const t* array, size_t size)
for (int i = _vec.size() / 2 - 1; i >= 0; --i)
}heap(const
vector
& vec)
}//插入乙個資料x到最小堆
void push(const t& x)
}//刪除堆頂資料
void pop()
}//得到堆頂資料
t& gettop()
//將根節點向下調整
void _adjustdown(vector
& vec, int root, size_t size)
// 3.若child小於跟節點,則交換child和root節點,並繼續向下調整
if (compare()(vec[child], vec[root]))
else}}
//乙個節點向上調整
void _adjust(vector
& vec, int pos)
else}}
//判空
bool empty()
size_t size()
private:
vector
_vec;
};
#include"heap.h"
void testheap()
; int
array[10] = ;
heap> heap1(array, 10);
cout
<< heap1.gettop() << endl;
heap1.push(5);
cout
<< heap1.gettop() << endl;
heap1.pop();
cout
<< heap1.gettop() << endl;
} int main()
資料結構 堆
最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...
資料結構 堆
資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...
資料結構 堆
堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...