数据结构与算法【堆】的Java实现

前言 

之前已经说过堆的特点了,具体文章在数据结构与算法【队列】的Java实现-CSDN博客。因此直接实现堆的其他功能。

建堆

所谓建堆,就是将一个初始的堆变为大顶堆或是小顶堆。这里以大顶堆为例。展示如何建堆。

  1. 找到最后一个非叶子节点
  2. 从后向前,对每个节点执行下潜

一些规律(0作为根节点时满足)

  • 一棵满二叉树节点个数为 2^h-1,如下例中高度 h=3 节点数是 2^3-1=7
  • 非叶子节点范围为 [0, size/2-1]

建堆的时间复杂度为O(n)。

一个基础的大顶堆实现代码如下

public class MaxHeap {int[] array;int size;public MaxHeap(int capacity) {this.array = new int[capacity];}public MaxHeap(int[] array) {this.array = array;this.size = array.length;heapify();}/*** 获取堆顶元素** @return 堆顶元素*/public int peek() {return array[0];}/*** 删除堆顶元素** @return 堆顶元素*/public int poll() {int top = array[0];swap(0, size - 1);size--;down(0);return top;}/*** 删除指定索引处元素** @param index 索引* @return 被删除元素*/public int poll(int index) {int deleted = array[index];up(Integer.MAX_VALUE, index);poll();return deleted;}/*** 替换堆顶元素** @param replaced 新元素*/public void replace(int replaced) {array[0] = replaced;down(0);}/*** 堆的尾部添加元素** @param offered 新元素* @return 是否添加成功*/public boolean offer(int offered) {if (size == array.length) {return false;}up(offered, size);size++;return true;}// 将 offered 元素上浮: 直至 offered 小于父元素或到堆顶private void up(int offered, int index) {int child = index;while (child > 0) {int parent = (child - 1) / 2;if (offered > array[parent]) {array[child] = array[parent];} else {break;}child = parent;}array[child] = offered;}// 建堆private void heapify() {// 如何找到最后这个非叶子节点  size / 2 - 1for (int i = size / 2 - 1; i >= 0; i--) {down(i);}}// 将 parent 索引处的元素下潜: 与两个孩子较大者交换, 直至没孩子或孩子没它大private void down(int parent) {int left = parent * 2 + 1;int right = left + 1;int max = parent;if (left < size && array[left] > array[max]) {max = left;}if (right < size && array[right] > array[max]) {max = right;}if (max != parent) { // 找到了更大的孩子swap(max, parent);down(max);}}// 交换两个索引处的元素private void swap(int i, int j) {int t = array[i];array[i] = array[j];array[j] = t;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/158545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 使用入门

背景 ChatGPT是一个强大的聊天机器人助手&#xff0c;内置了大量的互联网知识文档&#xff0c;且具有上下文记忆&#xff0c;可以帮我们快速地查找一些资料&#xff0c;了解一个知识&#xff0c;帮我们回答问题&#xff0c;编写代码等。此外&#xff0c;在使用ChatGPT时具有一…

二百零四、Flume——登录监听窗口报错Ncat: bind to :::44444: Address already in use. QUITTING.

一、目的 Flume安装好后测试开启监听窗口44444&#xff0c;结果报错Ncat: bind to :::44444: Address already in use. QUITTING. 二、报错详情 Ncat: bind to :::44444: Address already in use. QUITTING. 三、报错原因 经过分析发现&#xff0c;44444窗口已经被占用 […

多线程访问资源计数不正确问题分析

线程1&#xff1a;首先修改状态为-1&#xff0c;然后分配资源&#xff0c;资源分配成功后&#xff0c;修改状态为0 线程2&#xff1a;查询状态为-1&#xff0c;然后分配资源&#xff0c;资源分配成功后&#xff0c;修改状态为0 存在这种情况&#xff0c;在线程1修改状态为-1时&…

数据结构-快速排序“人红是非多”?看我见招拆招

目录 1.快速排序 Hoare版本&#xff1a; 挖坑法&#xff1a; 前后指针版本: 快速排序的时间复杂度 2.快速排序的优化 三数取中法选key 随机数选key 三路划分法 3. 非递归实现快速排序 1.快速排序 快速排序一共有三种版本&#xff1a;Hoare版本、挖坑法、前后指针版本…

腾讯云轻量数据库开箱测评,1核1G轻量数据库测试

腾讯云轻量数据库1核1G开箱测评&#xff0c;轻量数据库服务采用腾讯云自研的新一代云原生数据库TDSQL-C&#xff0c;轻量数据库兼100%兼容MySQL数据库&#xff0c;实现超百万级 QPS 的高吞吐&#xff0c;128TB海量分布式智能存储&#xff0c;虽然轻量数据库为单节点架构&#x…

kettle spoon连接MySQL8.0数据库报错解决方法

kettle 连接 mysql 8.0报错&#xff0c;显示无法连接到数据库服务 错误连接数据库 [11] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the databaseError connecting to database: (using class org.gjt.mm.mysql.D…

斯坦福NLP课程来了

生成式AI&#xff0c;尤其是以ChatGPT为首的大语言模型正在改变人们的生活方式&#xff0c;我想一定有小伙伴想加入NLP这个行列。 微软重磅发布4个适合初学者的机器学习资料 我在前一篇文章中分享了微软人工智能初学者课程&#xff0c;其中的【生成式AI】非常适合初学者&…

利用 Gem5 模拟器创建一个简单的配置脚本——翻译自官网

文章目录 创建简单的配置脚本gem5 配置脚本关于模拟对象的插话 创建配置文件全系统与系统调用模拟 运行Gem5 创建简单的配置脚本 本章教程将指导你如何为 gem5 设置一个简单的模拟脚本&#xff0c;并首次运行 gem5。我们假定你已完成本教程第一章的学习&#xff0c;并已成功创…

重生奇迹mu格斗怎么加点

1.力量加点 力量是格斗家的主要属性之一&#xff0c;它可以增加你的攻击力和物理伤害。因此&#xff0c;对于格斗家来说&#xff0c;力量加点是非常重要的。建议在前期将大部分的加点放在力量上&#xff0c;这样可以让你更快地杀死怪物&#xff0c;提高升级速度。 2.敏捷加点…

Java 环境其他下载2

1 Eclipse Temurin Latest Releases | Adoptium Eclipse Temurin 是由基于 OpenJDK 的开源 Java SE 产生的构建版本。Temurin 适用于 广泛的平台 以及诸多 Java SE 版本。以下列出了推荐用于生产的最新版本&#xff0c;并且定期由 Adoptium 社区发布更新和支持。迁移帮助、容器…

不是说人工智能是风口吗,那为什么工作还那么难找?

最近确实有很多媒体、机构渲染人工智能可以拿高薪&#xff0c;这在行业内也是事实&#xff0c;但前提是你有足够的竞争力&#xff0c;真的懂人工智能。 首先&#xff0c;人工智能岗位技能要求高&#xff0c;人工智能是一个涵盖了多个学科领域的综合性学科&#xff0c;包括数学、…

虹科分享 | 平衡速度与优先级:为多样化的实时需求打造嵌入式网络(3)——CAN与CANopen的实时能力与局限性

在回顾了选择具有实时能力的嵌入式通信系统的基本要求之后&#xff0c;我们现在将更详细地探讨CAN和CANopen的实时能力和局限性。 控制器局域网(CAN)协议是各个行业众多应用的基础&#xff0c;每个应用都有其独特的实时需求。CANopen和J1939等著名示例强调了该协议的多种适应性…

「浙江科聪新品发布」新品发布潜伏顶升式移动机器人专用控制器

聚焦专用车型 最小专用控制器 控制器只占整机5%&#xff0c;纵向出线方式&#xff0c;占比更小 更易插拔 整体解决方案 更具价格优势 提供整体解决方案&#xff0c;配套各类型产品设备及车体厂家 打造持久稳定使用 坚持工业级品质 采用车规级接口&#xff0c;不用其它类不可…

蓄势・前行 | 博格华纳的新能源+战略布局

10月11日-13日&#xff0c;AWC 2023深圳国际新能源及智能网汽车全产业博览会在深圳国际会展中心盛大开幕&#xff0c;此次展会现场共计接待专业观众3W余名&#xff0c;同期举办20场次主题论坛峰会&#xff0c;不仅汇聚众多中外汽车产业巨擘&#xff0c;更是一场涵盖智能驾驶、新…

(内部资料)收下这几个人工智能学习秘籍!

秘籍一&#xff1a;练好基本功 学习基础知识&#xff1a;人工智能涉及多个学科领域&#xff0c;包括数学、计算机科学、统计学等。因此&#xff0c;学习基础知识是非常重要的。您可以通过学习线性代数、概率论和微积分等数学基础知识&#xff0c;以及掌握Python编程语言和常用…

String类常用方法总结

目录 一.简单认识String 二.String对象的比较 1.equals 内部实现原理&#xff1a; 2.compareTo 3.compareToIgnoreCase 三.字符串查找 示例&#xff1a; 四.字符串与其他类型转化 1.数值和字符串相互转换 2.大小写相互转化 3.字符串转数组 4.格式化转化 五.字符串…

振南技术干货集:制冷设备大型IoT监测项目研发纪实(1)

注解目录 1.制冷设备的监测迫在眉睫 1.1 冷食的利润贡献 1.2 冷设监测系统的困难 &#xff08;制冷设备对于便利店为何如何重要&#xff1f;了解一下你所不知道的便利店和新零售行业。关于电力线载波通信的论战。&#xff09; 2、电路设计 2.1 防护电路 2.1.1 强电防护 …

企业该怎么选择IP证书

IP证书是一种数字证书&#xff0c;它由权威的数字证书颁发机构&#xff08;CA&#xff09;颁发&#xff0c;部署在只有公网IP地址的站点上&#xff0c;用于在网络中验证身份和保护信息安全。IP证书可以在各种场景下保护网站的信息安全&#xff0c;比如网站vip登录&#xff0c;线…

创作一款表情包生成微信小程序:功能详解与用户体验优化

一、引言 在当今社交媒体充斥着各种趣味表情包的时代&#xff0c;表情包生成工具成为许多用户创作和分享创意的热门选择。为了迎合这一趋势&#xff0c;我设计并开发了一款功能丰富、用户友好的微信小程序&#xff0c;旨在让用户能够轻松而有趣地创作个性化的表情包。这篇博客将…

【Spring总结】注解开发

本篇讲的内容主要是基于Spring v2.5的注解来完成bean的定义 之前都是使用纯配置的方式来定义的bean 文章目录 前言1. Spring v2.5 注解开发定义bean第一步&#xff1a;在需要定义的类上写上注解Component第二步&#xff1a;在Spring Config中定义扫描包第三步&#xff1a;主方法…