【数据结构与算法 | 堆篇】JAVA实现小顶堆

1. 堆的特点

  • 堆的逻辑结构是数组,内存结构是完全二叉树.完全二叉树即只有最后一层才有叶子节点.
  • 堆又分为大顶堆与小顶堆. 大顶堆的特点是 : 父亲节点比孩子节点的都要大. 小顶堆的特点与其相反.
  • Java的优先级队列(PriorityQueue)的底层实现即用到了小顶堆. 所以下文我们就用Java代码来实现小顶堆.
  • 本文没有像实现栈或队列那样使用了泛型,为了方便省去了泛型的步骤.

2. 小顶堆的实现

(1). 主要操作 : 

  • 堆化:传入一个数组,从下到上,最后一个非叶子节点开始,再从上到下不断进行下沉操作.
  • offer()添加元素:从数组尾部添加元素,不断上浮.
  • poll()弹出堆首元素.将堆首元素与最后一个叶子节点互换,size--,再从堆首开始下沉操作即可.

(2). 代码实现

//代码实现小顶堆
//逻辑结构是数组
public class MyHeap {private int size;private int[] heap;public MyHeap(int capacity) {heap = new int[capacity];}//堆化public void heapify(int[] arr) {for (int i = 0; i < arr.length; i++) {heap[i] = arr[i];}size = arr.length;//第一步 : 找到最后一个非叶子节点//第二步 : 从该节点出发, 从后往前, 以此堆化//size - 1即最后一个叶子节点, 依据公式, 该则为叶子节点的父亲节点for (int parent = (size - 1) / 2; parent >= 0; parent--) {int leftChild = parent*2 + 1;int rightChild = parent*2 + 2;int min = parent;//如果存在左孩子, 而且父亲节点比孩子节点要大if (leftChild < size && heap[min] > heap[leftChild]) {min = leftChild;}//如果存在右孩子, 而且右孩子的值比左孩子和父亲还要小if (rightChild < size && heap[min] > heap[rightChild]) {min = rightChild;}//如果最小值不是父亲, 那么需要下沉if (min != parent) {down(parent);}}}private void swap(int a, int b) {int temp;temp = heap[a];heap[a] = heap[b];heap[b] = temp;}private void down(int parent) {int leftChild = parent*2 + 1;int rightChild = parent*2 + 2;int min = parent;if (leftChild < size && heap[min] > heap[leftChild]) {min = leftChild;}if (rightChild < size && heap[min] > heap[rightChild]) {min = rightChild;}if (min != parent) {swap(min, parent);down(min);}}//向堆中添加元素, 如果该添加的元素比父亲节点(如果有的话)要小,//则需要上浮public void offer(int a) {if (size > heap.length) {return;}heap[size] = a;int child = size;size++;int parent;while (child >= 0) {parent = (child - 1) / 2;//如果添加的元素要比父亲要小if (heap[parent] > heap[child]) {swap(parent, child);child = parent;} else {//如果添加后父亲节点仍然符合小顶堆, 那么退出循环, 无需再上浮break;}}}//返回堆顶元素public int peek() {return heap[0];}//弹出堆顶元素//第一步 : 将最后一个叶子节点与堆顶元素互换, size--//第二步 : 从堆顶开始不断下沉public int poll() throws Exception {if (size == 0) {throw new Exception();}int value = peek();swap(0, size - 1);size--;//不断下沉int parent = 0;down(parent);return value;}
}

3. 单元测试

public class MyHeapTest {@Testpublic void test1() throws Exception {MyHeap heap = new MyHeap(10);int[] arr = new int[]{9, 12, 4, 3, 1};heap.heapify(arr);System.out.println(heap.peek());//1System.out.println(heap.poll());//1System.out.println(heap.peek());//3heap.offer(0);System.out.println(heap.peek());//0}
}

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

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

相关文章

K210视觉识别模块学习笔记3:内存卡写入拍摄图片_LED三色灯的操作_按键操作_定时器的配置使用

今日开始学习K210视觉识别模块: LED三色灯的操作_按键操作_定时器的配置使用_内存卡写入拍摄图片 亚博智能的K210视觉识别模块...... 本文最终目的是编写一个按键拍照的例程序&#xff1a; 为以后的专用场景的模型训练做准备&#xff0c;因为训练自己的模型需要大量的图片&a…

jmeter基础入门练习题

jmeter存在A,B两个线程组的情况下&#xff0c;默认设置下&#xff0c;运行顺序是&#xff1a;A A&#xff1a;A,B同时运行 B&#xff1a;先运行A&#xff0c;在运行B C&#xff1a;先运行A&#xff0c;等待2s运行B D:先A运行完&#xff0c;等待默认设置时间后运行B 下列说法正…

编译安装PHP服务(LAMP3)

目录 1.初始化设置&#xff0c;将安装PHP所需软件包传到/opt目录下 &#xff08;1&#xff09;关闭防火墙 &#xff08;2&#xff09;上传软件包到/opt目录 2.安装GD库和GD库关联程序&#xff0c;用来处理和生成图片 3.配置软件模块 4.编译及安装 5.优化把PHP 的可执行程…

nginx的安装001

Nginx是一款高性能的HTTP和反向代理服务器&#xff0c;以及邮件代理服务器&#xff0c;由 Igor Sysoev 开发并公开发布于2004年。Nginx以其高并发处理能力、低内存消耗和稳定性著称&#xff0c;特别适合部署在高流量的网站上。 操作系统&#xff1a; CentOS Stream 9 安装步骤…

【算法训练 day44 分割等和子集】

目录 一、分割等和子集-LeetCode 416思路实现代码1.二维dp代码2.一维dp代码 问题总结 一、分割等和子集-LeetCode 416 Leecode链接: leetcode 416 文章链接: 代码随想录 视频链接: B站 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&…

SQL入门教程,很详细

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库的标准语言。它被广泛用于存储、操作和检索数据。在这篇文章中&#xff0c;我们将介绍SQL的基本概念和常用命令。 首先&#xff0c;我们需要了解SQL的基本结构。SQL语句通常由以下几个部分组成&…

头歌数据结构与算法课程设计易-算式运算的合法性

给定一个算式运算&#xff0c;算式由运算数、、-、、/、(、)组成&#xff0c;请编写程序判断该算式运算是否合法。如果合法&#xff0c;计算该算式的值。 输入描述&#xff1a; 第一行输入一个运算表达式 输出描述&#xff1a; 如果表达式合法则计算其值&#xff0c;结果保留两…

c语言之向文件读写数据块

c语言需要向文件读写数据块需要用到fread语句和fwrite语句 fread语句的语法格式 fread(butter,size,count,fp) butter&#xff1a;读取的数据存入内存地址 size:读取的字节大小 count:读取数据的个数 fp:读取的文件指针 fwrite语句语法格式 fwrite(butter,size,count,fp…

企业如何利用社交媒体二维码做宣传?提升品牌形象

和普通的二维码不同&#xff0c;社交媒体二维码可以通过一个二维码链接企业的超过16的社交媒体渠道链接&#xff0c;包括&#xff1a;企业官网、小程序、公众号、淘宝店铺、抖音链接、小红书链接、美团链接、饿了么链接…等等。扫描之后&#xff0c;可以在这个社交媒体二维码界…

校园志愿者|基于SprinBoot+vue的校园志愿者管理系统(源码+数据库+文档)

校园志愿者管理系统 目录 基于SprinBootvue的校园志愿者管理系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2管理员功能 3志愿者功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&a…

采购订单审批和取消例子

文章目录 1 Introduction2 Example 1 Introduction This is a exmaple for releaseing po and reseting po. 2 Example DATA:lw_in TYPE zmms015,lw_out TYPE zmms015_out,lt_head LIKE TABLE OF ZMMT003_head,lw_head TYPE ZMMT003_head,lt_item TYPE zmmt003_item_t,lt…

12.RedHat认证-Linux文件系统(下)

12.RedHat认证-Linux文件系统(下) swap虚拟内存 我加一个硬盘做实验sdc # 创建交换分区&#xff08;不用做成逻辑卷也能灵活分区&#xff09; [rootcentos8 ~]# fdisk /dev/sdc -l Disk /dev/sdc&#xff1a;10 GiB&#xff0c;10737418240 字节&#xff0c;20971520 个扇区 …

REX 521馈线保护继电器提供 您的高效中压网络 保护、测量、监控和基本 控制功能

REX 521馈线保护继电器提供 您的高效中压网络 保护、测量、监控和基本 控制功能。典型的REX 521应用包括输入和输出馈线 在隔离中性点中&#xff0c;谐振接地&#xff0c;牢固 接地和电阻接地系统。 …完善ABB继电器解决方案系列 这种最先进的保护继电器补充了ABB的一系列解决方…

深入理解linux文件系统与日志分析

深入理解linux文件系统与日志分析 linux文件系统: 文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区&#xff0c;每个扇区的大小是512字节。 inode&#xff1a;元信息&#xff08;文件的属性 权限&#xff0c;创建者&#xff0c;创建日期等等&#xff09; block…

【AVL Design Explorer DOE】

AVL Design Explorer DOE 1、关于DOE的个人理解2、DOE参考资料-知乎2.1 DOE发展及基本类型2.2 DOE应用场景2.3 Mintab 中的 DOE工具3、AVL Design Explorer DOE示例 1、关于DOE的个人理解 仿真和试验一样&#xff0c;就像盲人摸象&#xff0c;在不知道大象的全景之前&#xff…

Java 垃圾回收

一、概述 GC GC(Garbage Collection)&#xff0c;在程序运行过程中内存空间是有限的&#xff0c;为了更好的的使用有限的内存空间&#xff0c;GC会将不再使用的对象清除然后将其所占用的内存释放出来。 java的垃圾回收机制 Java的垃圾收集&#xff08;Garbage Collection, …

嵌入式Linux复制剪切删除指令详解

指令操作 1. cp 复制指令 a. 用法&#xff1a;cp [ 选项 ] [ 源文件或目录 ] [ 目标文件或目录 ]&#xff1b; b. 用途&#xff1a;用于复制文件或目录&#xff1b; c. 通常情况下&#xff0c;复制的都不是空文件夹&#xff0c;所以直接使用 cp 复制空文件会失败&#xff0…

创建Django项目及应用

1 创建Project 1个Project可以对应多个app django-admin startproject myproject 2 创建App python manage.py startapp app01 INSTALLED_APPS [# ...app01,app02,# ... ] 如果要让这个应用在项目中起作用&#xff0c;需要在项目的 settings.py 文件的 INSTALLED_APPS 配置…

java中成员内部类、局部内部类、匿名内部类各自的特点

成员内部类&#xff1a;定义在类的内部&#xff0c;方法的外部&#xff0c;成员内部类作为外部类的成员&#xff0c;可以直接访问外部类的私有属性。 局部内部类&#xff1a;定义在方法的内部&#xff0c;对于局部内部类我们常常使用一个方法&#xff0c;得到一个接口实现类的…

臭氧浓度传感器在食品厂与制药厂中的应用

在食品厂和制药厂的生产过程中&#xff0c;消毒是一个至关重要的环节。有效的消毒可以确保产品免受微生物污染&#xff0c;从而保障消费者的健康。近年来&#xff0c;臭氧作为一种广谱杀菌剂&#xff0c;因其强效的消毒能力和低污染性&#xff0c;在食品厂和制药厂的消毒过程中…