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

向下调整算法(详解)c++

算法流程: 

  1. 与⽗结点的权值作⽐较,如果⽐它⼤,就与⽗亲交换; 
  2. 交换完之后,重复 1 操作,直到⽐⽗亲⼩,或者换到根节点的位置

大家可能会有点疑惑,这个是大根堆,22是怎么跑到上面的?刚开始的时候都是大根堆,比如22的位置,原本是99,是一个合法的大根堆,我们在删除堆的元素的时候,就会让小元素(22)跑到顶部,因为删除堆顶元素的操作是,堆尾本来有一个22,堆顶元素是99,我们要把99删掉,就是拿99和22交换,此时删除数组里面最后一个元素,就是删除99,22跑到上面的时候左右两边的子树都是一个合法的大根堆,就是22,不是平白无故爬上来的,是在删除堆顶元素的时候跑上来的,跑完之后左右子树全都是一个合法的堆,此时我们在执行向下调整到算法才是有意义的,如果22跑到上面的时候,左右边的子树都不是一个合法的大根堆的话,向下调整是没有意义的。 

时间复杂度

最差情况下,我会从根节点一直转移,转移一个树的高度,因此它的时间复杂度也是O(logN)

代码实现

void down(int parent)//拿当前结点和孩子作比较
{int child = parent * 2;//当孩子存在指向向下调整算法while (child <= n) //左孩子都不存在,右孩子一定不存在{//找最大的孩子//存在右孩子并且右孩子大于左孩子,条件满足指向最大的孩子,否则不作为if (child + 1 <= n && heap[child + 1] > heap[child]) child++;if (heap[parent] >= heap[child]) return; //如果父节点大于孩子节点就不用调整了swap(heap[parent], heap[child]); //交换父子节点parent = child; //父节点向下走child = parent * 2; //孩子向下走}
}

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

相关文章:

  • 蓝桥杯之c++入门(一)【C++入门】
  • 使用Python爬虫获取1688商品拍立淘API接口(item_search_img)的实战指南
  • ElasticSearch-文档元数据乐观并发控制
  • 使用Navicat Premium管理数据库时,如何关闭事务默认自动提交功能?
  • 【单细胞-第三节 多样本数据分析】
  • (java) IO流
  • 2025年1月个人工作生活总结
  • 线性调整器——耗能型调整器
  • 【2025美赛D题】为更美好的城市绘制路线图建模|建模过程+完整代码论文全解全析
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案
  • 拼车(1094)
  • 基于Python的人工智能患者风险评估预测模型构建与应用研究(下)
  • < OS 有关 > Android 手机 SSH 客户端 app: connectBot
  • 向量和矩阵算法笔记
  • uniapp使用uni.navigateBack返回页面时携带参数到上个页面
  • Python 梯度下降法(二):RMSProp Optimize
  • Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
  • sem_wait的概念和使用案列
  • 集合的奇妙世界:Python集合的经典、避坑与实战
  • 专业视角深度解析:DeepSeek的核心优势何在?
  • MySQL 索引存储结构
  • 【ComfyUI专栏】如何使用Git命令行安装非Manager收录节点
  • python算法和数据结构刷题[1]:数组、矩阵、字符串
  • 数据分析系列--④RapidMiner进行关联分析(案例)
  • 1/30每日一题
  • vim的多文件操作
  • 设计转换Apache Hive的HQL语句为Snowflake SQL语句的Python程序方法
  • CAPL与外部接口
  • 无公网IP 外网访问 本地部署夫人 hello-algo
  • 实验四 XML