堆——大根堆
2015-08-07 21:04
429 查看
#include <iostream> #include <iomanip> using namespace std; template<typename DataType> class Heap { public: Heap(); Heap(int); Heap( DataType[], int); bool removeTop(); DataType getTop(); bool insert( DataType ); bool empty() const; void display() const; private: int capacity; int size; DataType * topPointer; void displayAux( int, int ) const; }; template<typename DataType> Heap<DataType>::Heap() { size = 0; capacity = 10; topPointer = new DataType[capacity + 1]; } template<typename DataType> Heap<DataType>::Heap(int capacity) { size = 0; this.capacity = capacity; topPointer = new DataType[capacity + 1]; } template<typename DataType> Heap<DataType>::Heap(DataType arr[], int num) { size = 0; capacity = num; topPointer = new DataType[capacity + 1]; for(int i = 0; i < num; i++) insert( arr[i] ); } template<typename DataType> DataType Heap<DataType>::getTop() { return *(topPointer); } template<typename DataType> bool Heap<DataType>::removeTop() { *(topPointer + 1) = *(topPointer + size); int start = 1; int end = size; int next = 2*start; while( next <= end ) { if( next < end ) { if( *(topPointer + next) < *(topPointer + next + 1) ) next = next + 1; } if( *(topPointer + start) < *(topPointer + next ) ) { DataType tmp = *(topPointer + start); *(topPointer + start) = *(topPointer + next); *(topPointer + next) = tmp; } start = next; next = 2*start; } size--; return true; } template<typename DataType> bool Heap<DataType>::insert(DataType item) { if( ++size <= capacity ) *(topPointer + size) = item; else return false; int start = size; int next = size/2; while( next > 0 && *(topPointer + start) > *(topPointer + next) ) { DataType tmp = *(topPointer + next); *(topPointer + next) = *(topPointer + start); *(topPointer + start) = tmp; start = next; next = start/2; } return true; } template<typename DataType> bool Heap<DataType>::empty() const { return(0 == size); } template<typename DataType> void Heap<DataType>::display() const { displayAux(1,0); } template<typename DataType> void Heap<DataType>::displayAux(int index, int indent) const { if( index <= size ) { displayAux( index * 2 , indent + 8 ); cout << setw(indent) << *( topPointer + index) << endl; displayAux( index * 2 + 1, indent + 8 ); } else return; }
相关文章推荐
- Scala 深入浅出实战经典 第51讲:Scala中链式调用风格的实现代码实战及其在Spark中应用
- 杭电2188悼念512汶川大地震遇难同胞——选拔志愿者
- Oracle学习之DATAGUARD(十) 在同台机器上使用11g rman新特性创建DG
- 表视图学习笔记
- opencv Mat基本操作
- 不要62
- Java线程:新特征-线程池
- JAVA之编码/解码-文件输入输出流——转载
- C++static成员的使用
- Linux - test测试标志的意思总结
- (15.1.11)英语听力之短对话
- Linux - test测试标志的意思总结
- xcode工程添加预定义编译宏
- centos6.5适用的国内yum源:网易、搜狐
- Excel的导入导出
- (转)Java线程:新特征-线程池
- volatile关键字
- Trie树使用
- Spring AOP(1),静态代理
- (转)volatile关键字