博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手写堆
阅读量:6683 次
发布时间:2019-06-25

本文共 1621 字,大约阅读时间需要 5 分钟。

#include 
using namespace std;const int MAXN = 1e6 + 10;/**小根堆,size个元素的序列满足 k[i] <= k[2 * i] && k[i] <= k[2 * i + 1] (1 <= i <= size / 2)每次去除堆顶元素,只需要重新调整为堆即可push一个元素,相当于在对应的层上插入一个元素,这条链上下面的元素对应向下移pop一个元素 将堆顶元素和最后一个元素交换,再重新调整堆调整堆 由于除了堆顶元素之外,其余结点都符合堆的条件,所以只需要把堆顶元素调整到合适的位置即可,交换的时候 只会影响一边,所以复杂度就相当于深度*/int total_cnt;struct Heap { int data[MAXN]; int size; void clear(){size = 0;} int get_size(){return size;} bool is_empty(){return size == 0;} void swim(int pos){ while(pos << 1 <= size){ int l = pos << 1; if(l + 1 <= size && data[l + 1] < data[l]) l++; if(data[l] < data[pos]){ swap(data[l],data[pos]);pos = l; }else break; } } void push(int value){ data[++size] = value; int pos = size; while(pos > 1){ if(data[pos >> 1] > data[pos]){ swap(data[pos >> 1],data[pos]); pos >>= 1; }else break; } } int top(){return data[1];} void pop(){ swap(data[1],data[size]);size--; swim(1); }} h ;char s[1010];/**hdu 1106测试*/int main(){ while(~scanf("%s",s)){ int len = strlen(s); h.clear(); int sum = 0; for(int i = 0;i < len;i++){ if(s[i] != '5') sum = sum * 10 + s[i] - '0'; else{ if(i && s[i-1] != '5') h.push(sum); sum = 0; } } if(s[len-1] != '5') h.push(sum); while(!h.is_empty()){ if(h.get_size() == 1) printf("%d\n",h.top()); else printf("%d ",h.top()); h.pop(); } } return 0;}

转载于:https://www.cnblogs.com/jiachinzhao/p/7598796.html

你可能感兴趣的文章
Flask开发
查看>>
trickle 限制用户空间带宽
查看>>
解决perl+mysql+mongodb中文乱码问题
查看>>
SQL事务
查看>>
eclipse调试时鼠标移动到变量上不显示值的问题
查看>>
Java 序列化与反序列化实例记录
查看>>
安装oracle过程报错
查看>>
shell 批量检测多台服务器的某个端口
查看>>
Cisco 4507R-E引擎更换
查看>>
在安装apache时遇到的困难
查看>>
我的友情链接
查看>>
将GNS3与secure_crt结合起来
查看>>
ARM世界之旅(一):特殊的生存之道
查看>>
Spark基础知识学习分享
查看>>
hadoop2.x启动停止的命令
查看>>
AD域中客户端时间与服务器时间不同步的解决办法
查看>>
vmware虚拟机安装后联网的处理方案
查看>>
我的友情链接
查看>>
OA和ERP谁先行
查看>>
我的友情链接
查看>>