最大堆【东北大学oj数据结构9-2】C++

ops/2024/12/23 0:40:17/

满足“节点键值小于或等于其父键值”的最大堆条件的堆称为最大堆。 在最大堆中,最大的元素存储在根中,以某个节点为根的子树的节点的键值小于或等于该子树的根的键值。 请注意,只有父母和孩子之间有大小关系,兄弟姐妹之间没有限制。

创建一个程序,根据以下伪代码从给定数组构建最大堆。
maxHeapify (A, i) 将 A [i] 的值降低到最大堆叶,以便以节点 i 为根的子树是最大堆。 令 H 为堆大小。

 maxHeapify(A, i)
     l = left(i)
     r = right(i)
     if l ≤ H and A[l] > A[i]
         largest = l
     else 
         largest = i
     if r ≤ H and A[r] > A[largest]
        largest = r
     if largest ≠ i
        A[i] and A[largest] 
        maxHeapify(A, largest) 

下面的 buildMaxHeap (A) 通过自底向上应用 maxHeapify 将数组 A 转换为最大堆。 

buildMaxHeap(A)
   for i = H/2 downto 1
       maxHeapify(A, i) 

输入
输入的第一行给出了堆的大小 H。 然后,从节点号1到H依次给出代表堆中节点值的H个整数,用空格隔开。

输出
max-按照从节点号1到H的顺序在一行打印堆中节点的值。 在每个值之前输出一个空格字符。

约束
1 ≤ H ≤ 500,000
−2,000,000,000 ≤ 节点值 ≤ 2,000,000,000

输入样例

10
4 1 3 2 16 9 10 14 8 7

输出样例

16 14 10 8 7 9 3 2 4 1 

#include <iostream>
#include <vector>using namespace std;void maxHeapify(vector<int>& A,int i,int H)
{int left=2*i+1;int right=2*i+2;int largest=i;if(left<H&&A[left]>A[i])largest=left;if(right<H&&A[right]>A[largest])largest=right;if(largest!=i){swap(A[i],A[largest]);maxHeapify(A,largest,H);}
}
void buildMaxHeap(vector<int>& A,int H)
{for(int i=H/2-1;i>=0;i--)maxHeapify(A,i,H);
}int main() {int H;cin >> H;vector<int> A(H);for (int i = 0; i < H; ++i) {cin >> A[i];}buildMaxHeap(A,H);for (int i = 0; i <H; ++i) {cout<<A[i]<<" ";}cout << endl;return 0;
}

 

 


http://www.ppmy.cn/ops/144176.html

相关文章

.NET周刊【12月第2期 2024-12-08】

国内文章 终于解决了.net在线客服系统总是被360误报的问题&#xff08;对软件进行数字签名&#xff09; https://www.cnblogs.com/sheng_chao/p/18581139 升讯威在线客服与营销系统由.net core和WPF开发&#xff0c;旨在开放、开源、共享。开发者为解决360与其他国产管家的误…

SpringBoot项目的创建方式

目录 1.通过idea创建SpringBoot项目 2.在idea中通过aliyun创建SpringBoot 3.通过spring官网下载再用idea打开 5.通过mavenjava项目改为springboot项目 6.测试springboot 第二种方法使用的是idea2021版本&#xff0c;其余方法使用idea2017版本 1.通过idea创建SpringBoot项…

基于ubuntu的mysql 8.0安装教程

文章目录 1.查看版本2.切换到root账户3.下载安装包4.问题的解决5.查看是否解压成功6.安装我们的发布包7.更新包的内容8.下载mysql9.查看mysql的状态10.设置开机自启动11.登录mysql 公司里面的mysql根本不会出现在windows操作系统上面&#xff0c;下面我们演示的就是如何在ubunt…

呼入机器人:24小时客户服务的未来趋势

呼入机器人&#xff1a;24小时客户服务的未来趋势 作者&#xff1a;开源大模型智能呼叫中心系统FreeAICC&#xff0c;Github&#xff1a;https://github.com/FreeIPCC/FreeAICC 在当今快节奏的商业环境中&#xff0c;客户服务已成为企业竞争的核心要素之一。随着人工智能技术…

记录学习《手动学习深度学习》这本书的笔记(六)

看到第九章&#xff1a;现代循环神经网络了&#xff0c;循环神经网络这块真的有点难&#xff0c;而且老师也没有细讲这块&#xff0c;只能自己慢慢理解。 第九章&#xff1a;现代循环神经网络 9.1 门控循环单元&#xff08;GRU&#xff09; 这一节介绍了一个循环神经网络的“…

sqoop导入hdfs,hive

sqoop将mysql中的表导入到hdfs中 sqoop import \ > --connect jdbc:mysql://192.168.52.150/test \ > --username root \ > --password 123456 \ > --table emp \ > --delete-target-dir \ > --target-dir /sqoop_works/emp_1将数据导入hive中&#xff0c;首…

Linux Systemd基础教程

一、什么是systemd&#xff1f; systemd是Linux系统的一套基本构建模块。它提供了一个系统和服务管理器&#xff0c;作为PID 1运行并启动系统的其余部分。 systemd提供积极的并行化功能&#xff0c;使用套接字和D-Bus激活来启动服务&#xff0c;提供按需启动守护进程&#xf…

【Elasticsearch05】企业级日志分析系统ELK之集群工作原理

Elasticsearch 集群工作原理 官方说明 Elasticsearch Guide [8.17] | Elastichttps://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 单机节点 ES 存在单点可用性和性能问题,可以实现Elasticsearch多机的集群解决 Elasticsearch 支持集群模式 能够提…