小顶堆的C++实现
来源:互联网 发布:淘宝自动回复经典语句 编辑:程序博客网 时间:2024/06/01 10:14
小顶堆就一个特性,儿子比老子大,应该算是比较好实现的数据结构,一共就两个操作。
插入:插入到树的最后,然后往上升
删除:为了实现方便,普遍的做法是用最后一个node替换堆顶,然后把这个node往下降就行了。
其他如建树,更新等操作都是这两个操作的组合。
代码如下:
</pre><pre name="code" class="cpp">#include <iostream>#include <vector>using namespace std;class MinHeap{private: vector<int> a;public: MinHeap(int nums[], int n)//构造小顶堆 { for (int i=0; i<n; i++) a.push_back(nums[i]); for (int i=a.size()/2-1; i>=0; i--) down(i); } void swap(int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } void up(int i)//上升操作 { int f = (i-1)/2; if (i>0 && a[i]<a[f]) { swap(i, f); up(f); } } void push(int p)//插入点 { a.push_back(p); up(a.size()-1); } void down(int i)//下降操作 { int son = 2*i+1; if (son<a.size()) { if (son+1<a.size() && a[son]>a[son+1]) son++; if (a[i]>a[son]) swap(i, son); down(son); } } int pop()//弹出堆顶 { int result = a[0]; swap(0, a.size()-1); a.pop_back(); down(0); return result; } void show() {//输出堆 for (int i = 0; i < a.size(); i++) { cout << a[i]; } cout << endl; }};int main(){ int a[] = {1,3,4,6,2,5,0,7}; MinHeap* m = new MinHeap(a,8); //测试 m->show(); cout<< m->pop() << endl; m->show(); m->push(0); m->show(); return 0;}
嫌up和down递归效率低的可以改成while~
代码没有严格测试,出错了不要打我啊= =。
1 0
- [C/C++]汉诺塔的实现
- 堆栈的C实现
- C的类实现
- c库函数的实现
- c实现的urlencode
- Base64的 c实现
- C实现的泛型栈
- 哈希表的C实现
- C中泛型的实现
- 哈希表的C实现
- C实现的五子棋
- C实现的俄罗斯方块
- C泛型栈的实现
- C 实现的Music
- c 双链表的实现
- 单链表的C实现
- 栈的C实现
- C/C++的实现
- javascript中escape()、unescape()、encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()比较
- MFC工程中增加注册类名
- roslaunch + gdb debug
- 枚举类型的使用
- ajax请求接口里的数据,然后显示在页面里
- 小顶堆的C++实现
- 消息中间件中术语
- 从0开始学习 GitHub 系列之「GitHub 常见的几种操作」
- 中缀表达式求值(模板)
- EmguCV提取轮廓的一个例子
- 【转】VS2010 RDLC报表 矩阵 详解 分组、总计、表头、显示方向、序号
- nginx做反向负载均衡,后端服务器获取真实客户端ip
- perl学习笔记-----------------------(2)
- 自定义异常类