当前位置: 首页 > news >正文

..堆..

堆是完全二叉树,即除了最后一列之外,上面的每一层都是满的(左右严格对称且每个节点都满子节点)
 最后一列从左向右排序。

默认大根堆:每一个节点都大于其左右儿子,根节点就是整个数据结构的最大值
 priority_queue<int, vector<int>, less<int>> q;或者priority_queue<int> q;
 小根堆:每一个节点都小于其左右儿子,根节点就是整个数据结构的最小值
 priority_queue<int, vector<int>, greater<int>> q;

题目:838. 堆排序 - AcWing题库

题解:

本题使用使用小根堆。
heap[]表示模拟整个树的数组,size表示整个数组的长度
up(x),down(x)来维护整个二叉树。up将小的值上浮,down将大的值下沉;(都是递归的思想)
1.插入一个数heap[ ++ size] = x ;up(size)。先将其插入到最后一列,然后向上上浮

2.求集合当中的最小值 heap[1]

3.删除最小值 heap[1]=heap[size];size--;down(1)
4.删除任意一个元素 heap[k]=heap[size];size--;up(k);down(k)。(不是上升就是下沉,堆只会执行一个操作。当执行up()操作时说明k代表的数值较小,所以会上浮,那么就一定不会down()(下沉));
5.修改任意一个元素heap[k]=x;down[k];up[k];
(4、5。stl(优先队列)不可直接实现) 
用一维数组来存,下标从1开始。(左右节点2x,2x+1。若从0开始,那一开始的左节点等于根节点了)

代码:

本体的暴力解法可以直接sort( ),在这里不再给出。

#include<bits/stdc++.h>using namespace std;const int N=1e5+10;
int heap[N],ans;void down(int x)
{int u=x;if(x*2<=ans && heap[u]>heap[2*x]) u=2*x;if(2*x+1<=ans && heap[u]>heap[2*x+1]) u=2*x+1;//如果不相等就代表根节点不是最小的(此时根节点数组对应的下标已经被子节点的下标覆盖)if(u!=x){//交换值,使根节点变成最小的swap(heap[x],heap[u]);down(u);}
}
int main()
{int n,m;cin >> n >> m;for(int i=1;i<=n;i++) cin >> heap[i];ans=n;//构建二叉树for(int i=n/2;i;i--) down(i);while(m--){cout << heap[1] << " ";
//输出完后,依照本题,根节点就没用了,需要删掉,然后输出下一次的根节点
//让根节点等于本二叉树中最大的值heap[1]=heap[ans];
//整个二叉树的长度减一ans--;
//让根节点下沉down(1);}
}

板子:

tips:

 

http://www.lryc.cn/news/353640.html

相关文章:

  • 【LLM多模态】综述Visual Instruction Tuning towards General-Purpose Multimodal Model
  • 探索Linux中的神奇工具:重定向符的妙用
  • Kubernetes 文档 / 概念 / 工作负载 / 工作负载管理 / Job
  • 办公自动化-Python如何提取Word标题并保存到Excel中?
  • 基于Java、SpringBoot和uniapp在线考试系统安卓APP和微信小程序
  • 抖音a-bogus加密解析(三)
  • IS-IS DIS
  • random和range
  • 研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?
  • Golang:gammazero/deque是一个快速环形缓冲区deque(双端队列)实现
  • C++ 时间处理-统计函数运行时间
  • JAVA面试题大全(十五)
  • 使用python对指定文件夹下的pdf文件进行合并
  • Day50 | 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 总结
  • Steam在连接至服务器发生错误/连接服务器遇到问题解决办法
  • kafka 工作流程文件存储
  • 贪心算法4(c++)
  • 【无标题】yoloV8目标检测与实例分割--目标检测onnx模型部署
  • 深入理解与防御跨站脚本攻击(XSS):从搭建实验环境到实战演练的全面教程
  • 初步认识栈和队列
  • 插件:NGUI
  • 网络爬虫原理及其应用
  • 串口中断原理及实现
  • 课时136:变量进阶_变量实践_高级赋值
  • 牛客网刷题 | BC99 正方形图案
  • 启动小程序F12窗口管理器
  • 完全背包之零钱兑换I
  • Flutter 中的 FittedBox 小部件:全面指南
  • Java的线程的使用
  • 行为型模式 (Python版)