C++动态数组简单的模拟二元堆
2015-10-24 14:12
459 查看
//C++动态数组简单的模拟二元堆 #include<iostream> using namespace std; class BinaryHeap { private: int cap; //该阵列的最大容量 int size; //当前元素个数 int* datas; //数组首地址 public: explicit BinaryHeap(int cap_) :cap(cap_), size(0) { datas = new int[cap]; } ~BinaryHeap(){ delete datas; } void Insert(int); int DeleteMin(); }; //用数组表示的树,当下标从0開始时,i为当前节点,i*2+1为i的左子树节点,i*2+2为i的右子树节点,i/2为i的父节点 void BinaryHeap::Insert(int data) { int i; for (i = size; i / 2 >= 0 && datas[i / 2] > data; i /= 2) //上滤 { datas[i] = datas[i / 2]; } datas[i] = data; size++; } int BinaryHeap::DeleteMin() { int i = 0, child = 0; int lastdata = datas[--size]; int mindata = datas[0]; for (i = 0; i * 2 + 1 <= size-1; i = child) //下滤 { child = i * 2 + 1; if (child < size-1 && datas[child + 1] < datas[child]) { child++; } if (lastdata > datas[child]) { datas[i] = datas[child]; } else { break; } } datas[i] = lastdata; return mindata; } int main() { BinaryHeap t(400); for (int i = 0; i < 100; i++) t.Insert(i); for (int i = 200; i > 100; i--) t.Insert(i); for (int i = 0; i < 200; i++) cout << t.DeleteMin() << endl; cin.get(); return 0; }
相关文章推荐
- C++按位运算符
- c++web方案
- C语言:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(
- 【C语言】【笔试题】找出一组数据中成单出现的数字,其他所有数字都是成对出现的。(移位)
- 【C语言】不使用(a+b)/2这种方式,求两个数的平均值。
- 【C语言】【笔试题】编写函数: unsigned int reverse_bit(unsigned int value); 翻转二进制序列
- 【C语言】【笔试题】两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
- 对于sizeof的含义、应用及易混点的解析
- VC++ 将资源位图画到窗口上去的方法
- C++函数指针简介
- C++函数指针简介
- C语言:不使用(a+b)/2这种方式(会溢出),求两个数的平均值
- C语言:编写函数将一个整数的二进制位模式从左到右翻转后的值输出
- C语言:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同(模除、移位)
- c语言 常量
- C++ 栈
- 总结sublime c++编译环境搭建 | 中文乱码问题解决方案 |sidebar配置 |sublime最佳插件列表|最佳主题方案
- C++ STL 排序(Sort)
- STL之hashset实现
- [C++] Operator Overload