概念:

堆就是一颗二叉树,满足父亲节点总是比儿子节点大(小)。因此,堆也分为大根堆和小根堆,大根堆就是父亲节点比儿子节点大,小根堆正好相反。注意加粗的地方,是每一个节点哦!!!!!


还是直接看例题吧,这样讲起来更加生动。

上题:【模板】堆


解析:

这道题明显就是一个小根堆,那,怎么实现呢?热爱数组的我选择了数组实现明明就是指针不会。

操作1:添加一个数字

这里需要用到两个函数,一个insert函数,用来插入,一个ufix函数,用来更新。

void ufix(int i){
if(i <= 1) return; //如果都到根了,退出
if(h[i] < h[i / 2]){ //向上比较
swap(h[i] , h[i / 2]);
ufix(i / 2);
}
}
void insert(int x){
h[++tot] = x; //在末尾加上这个数,然后进行更新
ufix(tot); //对这个点进行更新
}

操作2:输出最小的数字(也就是堆顶)

直接输出堆顶就行了qwq。

if(x == 2) cout << h[1] << endl;

操作3:删除最小的数字(也就是堆顶)

这里也需要两个函数,一个delet函数,用来删除,一个dfix函数,用来更新。

void dfix(int i){
if(h[i] == 0x3fffffff) return; //如果已经越界了,就直接退出
int k;
if(h[i * 2] < h[i * 2 + 1]) k = i * 2; //比较左右儿子谁更优
else k = i * 2 + 1;
if(h[i] > h[k]){ //看自己是否需要更新
swap(h[i] , h[k]);
dfix(k);
}
}
void delet(){
swap(h[1] , h[tot]);
h[tot--] = 0x3fffffff; //删除
dfix(1);
}

完整代码

#include <bits/stdc++.h>
using namespace std;
int n , tot = 0;
int h[1000010];
void ufix(int i){
if(i <= 1) return;
if(h[i] < h[i / 2]){
swap(h[i] , h[i / 2]);
ufix(i / 2);
}
}
void dfix(int i){
if(h[i] == 0x3fffffff) return;
int k;
if(h[i * 2] < h[i * 2 + 1]) k = i * 2;
else k = i * 2 + 1;
if(h[i] > h[k]){
swap(h[i] , h[k]);
dfix(k);
}
}
void insert(int x){
h[++tot] = x;
ufix(tot);
}
void delet(){
swap(h[1] , h[tot]);
h[tot--] = 0x3fffffff;
dfix(1);
}
int main(){
cin >> n;
fill(h + 1 , h + 1000010 + 1 , 0x3fffffff);
while(n--){
int x;
cin >> x;
if(x == 1){
cin >> x;
insert(x);
}else if(x == 2) cout << h[1] << endl;
else delet();
}
return 0;
}

其实优先队列可以直接A的(其内部就是堆实现嘛),但是自己手写一遍可以加深理解哦。

最新文章

  1. 【repost】JS错误类型的学习
  2. 计算机程序的思维逻辑 (44) - 剖析TreeSet
  3. LeetCode First Unique Character in a String
  4. 非常好的Oracle教程【转】
  5. rabbitMQ+yii2 使用
  6. Sublime Text2配置过程
  7. 孙鑫MFC学习笔记:15多线程
  8. python thread的join方法解释
  9. iOS 证书申请和使用详解(详细版)
  10. iOS开发——实战OC篇&amp;环境搭建之StoryBoard(玩转UINavigationController与UITabBarController)
  11. ACM题集以及各种总结大全!
  12. asp.net 的那点事(2、浏览器和一般处理程序)
  13. Spring in Action --- 第一章 简介
  14. mysql 修改 添加 删除 表字段
  15. [TCP/IP] 数据链路层-ethereal 抓包分析数据帧
  16. kafka原理和架构
  17. [Swift]LeetCode823. 带因子的二叉树 | Binary Trees With Factors
  18. es某个分片受损或卡在INITIALIZING状态时解决办法
  19. 闭包传递(floyed)
  20. centos 上不了网了

热门文章

  1. Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
  2. Java实现第八届蓝桥杯图形排版
  3. 第四届蓝桥杯JavaC组国(决)赛真题
  4. java实现扑克牌排列
  5. java代码(10) ---Java8 Map中的computeIfAbsent方法
  6. Linux 权限管理-ACL权限
  7. 本地存储 localStorage
  8. jQuery实现购物车商品数量及总价的计算
  9. SQL--SQL详解(DDL,DML,DQL,DCL)
  10. 织梦cms 内容模型 option下拉框 value 分离