实现堆结构
来源:互联网 发布:win10以太网未识别网络 编辑:程序博客网 时间:2024/05/18 13:47
题目如下:
描述
定义一个数组,初始化为空。在数组上执行两种操作:
1、增添1个元素,把1个新的元素放入数组。
2、输出并删除数组中最小的数。
使用堆结构实现上述功能的高效算法。
对于每组测试数据,第一行输入一个整数n,代表操作的次数。
每次操作首先输入一个整数type。
当type=1,增添操作,接着输入一个整数u,代表要插入的元素。
当type=2,输出删除操作,输出并删除数组中最小的元素。
1<=n<=100000。
251 11 21 32241 51 11 72
121
需要使用最小堆结构来实现本题的算法
以前写树的代码时一直用的链表形式,现在试了一下数组的写法,感觉比较也比较好理解,写法也比较简单。代码及注释如下:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[100010];int n;//下标下移,在删除后更新树时需要用到void down( int root ){ int son = 2*root; //记录根节点的左儿子 int t = a[root]; while( son <= n) { if( son <= n -1 && a[son] > a[son+1]) //防止数组越界,且记录较小值儿子节点的下标 son++; if( t > a[son]) //更新节点。 { a[root] = a[son]; root = son; son = 2*root; } else break; } a[root] = t;}//数组下标上移,插入节点时用到。void up( int son ){ int t = a[son]; int tson = son; while( (tson > 1)&&( a[tson/2] > t)) //更新节点。 { a[tson] = a[tson/2]; tson = tson/2; } a[tson] = t;}void charu( int t){ a[ ++n ] = t; up( n );}void del( ){ if(n==0) return ; cout << a[1] << endl; //根节点肯定是最小值。 a[1] = a[n--]; down( 1 );}int main(){ int t; scanf("%d",&t); while( t-- ) { n = 0; int type; int m; scanf("%d",&m); for(int i = 0; i< m; i++) { scanf("%d",&type); if(type == 1) { int b; scanf("%d",&b); charu( b ) ; } else { del(); } } } return 0;}
0 0
- 堆结构的实现
- 1:实现堆结构
- 链式结构实现堆
- 实现堆结构
- 实现堆结构
- 实现堆结构
- 4078:实现堆结构
- C++ 堆结构(数组实现)
- 自己实现的堆结构
- C++ 堆结构(数组实现)
- 链式结构实现堆排序
- C++ 堆结构(数组实现)
- 百练 实现堆结构
- 算法-----堆结构实现优先级队列
- 基于堆结构的TopN问题实现
- java使用堆结构实现优先队列
- 堆结构的C++模板类实现
- 堆结构(一) - 二叉堆的原理与实现
- SQL Server Profiler和数据库引擎优化顾问
- 单例
- php开发那点事儿(一)
- Android中MediaPlayer的setDataSource方法的使用
- hdu 1051 Wooden Sticks
- 实现堆结构
- bit
- Android adb命令选择设备安装apk
- TestNG 断言类重写
- 智能变电站测试关键技术
- 数据库范式
- Android学习笔记之AndroidManifest.xml文件解析
- 2016年7月12日-日记
- ActiveMQ学习总结(9)——Linux中安装ActiveMQ