数据结构中的堆(Java)

文章目录

  • 把普通数组转换大顶堆数组
  • 堆增删改查替换
  • 堆排序

把普通数组转换大顶堆数组

在这里插入图片描述
该方式适用索引为0起点的堆

在堆(Heap)这种数据结构中,节点被分为两类:叶子节点(Leaf Nodes)和非叶子节点(Non-Leaf Nodes)。
叶子节点是指没有子节点的节点,它们位于堆的最底层。在堆中,叶子节点的数量总是大于或等于非叶子节点的数量。

非叶子节点是指至少有一个子节点的节点,它们位于堆的上层。在二叉堆(Binary Heap)中,非叶子节点的数量总是等于总节点数的一半(向上取整)。

在堆的操作中,非叶子节点的重要性体现在维护堆的性质(如最大堆或最小堆)方面。当插入或删除节点时,可能需要对非叶子节点进行调整,以确保堆的性质得到维护。

package Heap;import java.util.Arrays;//大顶堆
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();}//建堆private void heapify(){
//        size/2-1找到非叶子节点for (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 (left<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;}public static void main(String[] args) {int []  arr= {1,2,3,4,5,6,7};MaxHeap maxHeap = new MaxHeap(arr);System.out.println(Arrays.toString(maxHeap.array));}
}

堆增删改查替换

package Heap;import java.util.Arrays;// 大顶堆
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();}// 获取堆顶元素public int peek() {return array[0];}// 删除堆顶元素public int poll() {int top = array[0];swap(0, size - 1);size--;down(0);return top;}// 删除指定索引public int poll(int index) {int delete = array[index];swap(index, size - 1);size--;// 维护堆的性质if (index > 0 && array[index] > array[(index - 1) / 2]) {up(index);} else {down(index);}return delete;}// 替换指定索引的元素public void replace(int index, int value) {int oldValue = array[index];array[index] = value;// 维护堆的性质if (value > oldValue) {up(index);} else {down(index);}}// 在堆尾部添加元素public void add(int value) {array[size] = value;size++;up(size - 1);}// 建堆private void heapify() {// size/2-1找到非叶子节点for (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);}}// 将 child 索引处的元素上浮:与父节点比较,直至父节点大于等于它private void up(int child) {int parent = (child - 1) / 2;while (child > 0 && array[child] > array[parent]) {swap(child, parent);child = parent;parent = (child - 1) / 2;}}// 交换两个索引private void swap(int i, int j) {int t = array[i];array[i] = array[j];array[j] = t;}public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7};MaxHeap maxHeap = new MaxHeap(arr);System.out.println(Arrays.toString(maxHeap.array));maxHeap.add(8);System.out.println(Arrays.toString(maxHeap.array));maxHeap.replace(3, 9);System.out.println(Arrays.toString(maxHeap.array));maxHeap.poll(2);System.out.println(Arrays.toString(maxHeap.array));}
}

堆排序

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Spring事务及事务传播机制

目录 一、什么是事务 二、事务的操作 三、Spring下实现事务 1、Spring编程式事务 &#xff08;1&#xff09;事务提交 &#xff08;2&#xff09;事务回滚 2、Spring声明式事务 &#xff08;1&#xff09;无异常--提交 &#xff08;2&#xff09;异常且不捕获--回滚 …

电机特性学习

电机特性 电机堵转&#xff1a; 电机堵转的原理 玻璃升降器&#xff1a; 工作电压 升降器在 9V~16V 电压下应运行平稳,不允许有异音和卡滞现象。 工作电流 升降器的工作电流不大于 12A,堵转电流不大于 28A。 堵转 力 升降器 堵转 力应 不小于 212N。 玻璃升降器结构 电动车窗…

删除数据表

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 删除数据表属于数据库对象的操作 drop table 表名称; 删除 emp30 表 SQL> drop table emp30;表已删除。 上面这个语句运行后&#xff0c;就会把数据表 emp30 删除 在…

一起玩儿3D打印机——01 3D打印机初探

摘要&#xff1a;本文介绍3D打印技术的基本知识以及3D打印机的结构分类和组成 3D打印技术这几年得到了快速的发展&#xff0c;在一些特定领域和特定行业逐渐被越来越多的人所接受并大量使用。与之相关的供应链和产业链也日益壮大&#xff0c;并形成了完善的体系。 这次之所以…

蓝桥杯刷题7

目录 1. 字母数 2. 列名 3. 大乘积 4. 最大连通 5. 星期几 1. 字母数 public class Main {public static void main(String[] args) {int num 2023;while(true) {String mInteger.toString(num,16);if(m.matches("^[a-f]$")){System.out.println(num);break;}n…

Linux环境安装配置JDK11

文章目录 第一步&#xff1a;上传JDK11安装包第二步&#xff1a;解压安装包第三步&#xff1a;修改环境变量第四步、测试是否安装成功总结 JDK 11 是 Java 开发工具包&#xff08;Java Development Kit&#xff09;的一个版本&#xff0c;它是由 Oracle 公司开发和发布的。以下…

集成Mybatis Generator dao层代码生成

Mybatis Generator dao层代码生成 介绍 我们在使用mybatis开发的时候&#xff0c;需要去写表的基本的crud&#xff0c;这些咱们通常定义到dao层里面去&#xff0c;而mybatis generator可以帮我们把这件事情自动完成&#xff0c;大大节省时间并且可以规范dao层的代码。 sprin…

关于并发编程的一些总结

并发编程 1.synchronized是什么&#xff1f; synchronized是Java中的一个关键字&#xff0c;主要是为了解决多个线程访问共享资源的同步性&#xff0c;可以保证被它修饰的代码块或方法在任何时间至多只有一个线程执行。 2.synchronized的进化史? 在早期Java版本中&#xf…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的火焰检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本研究详述了一种采用深度学习技术的火焰检测系统&#xff0c;该系统集成了最新的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别火焰目…

数据分析-Pandas如何观测数据的中心趋势度

数据分析-Pandas如何观测数据的中心趋势度 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据…

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。 追赶 Sora&#xff0c;成为了很多科技公司当下阶段的新目标。研究者们好奇的是&#xff1a;Sora 是如何被 OpenAI 发掘出来的&#xff1f;未来又有哪些演进和应用方向&#xff1f; Sora 的技术报告披露了一些技术细节&…

趣学前端 | JavaScript标准库

背景 最近睡前习惯翻会书&#xff0c;重温了《JavaScript权威指南》这本书。这本书&#xff0c;文字小&#xff0c;内容多。两年了&#xff0c;我才翻到第十章。因为书太厚&#xff0c;平时都充当电脑支架。 JavaScript标准库 今天阅读的章节是JavaScript标准库&#xff0c;…

数据库规范化设计案例解析

1.介绍 数据库规范化设计是数据库设计的一种重要方法&#xff0c;旨在减少数据库中的冗余数据&#xff0c;提高数据的一致性&#xff0c;确保数据依赖合理&#xff0c;从而提高数据库的结构清晰度和维护效率。规范化设计通过应用一系列的规范化规则&#xff08;或称“范式”&a…

【死磕Elasticsearch】从实战中来,到实战中去

文章目录 写在前面&#xff1a;1、索引阻塞的种类2、什么时候使用阻塞&#xff1f;场景1&#xff1a;进行系统维护场景。场景2&#xff1a;保护数据不被随意更改场景。场景3&#xff1a;优化资源使用的场景。场景4&#xff1a;遵守安全规则场景。 3、添加索引阻塞API4、解除设置…

HarmonyOS预览功能报错:[webpack-cli] SyntaxError: Unexpected end of JSON input

harmonyos预览功能报错 在使用DevEco Studio写页面&#xff0c;进行预览的时候报错&#xff1a; [Compile Result] [webpack-cli] SyntaxError: Unexpected end of JSON input [Compile Result] at JSON.parse (<anonymous>) [Compile Result] at updateCached…

psutil, 一个超级有用的Python库

Python的psutil是一个跨平台的库&#xff0c;可以用于获取系统运行时的各种信息&#xff0c;包括CPU使用率、内存使用情况、磁盘和网络信息等。它主要用来做系统监控&#xff0c;性能分析&#xff0c;进程管理。它实现了同等命令行工具提供的功能&#xff0c;如ps、top、lsof、…

20240312-2-贪心算法

贪心算法 是每次只考虑当前最优&#xff0c;目标证明每次是考虑当前最优能够达到局部最优&#xff0c;这就是贪心的思想&#xff0c;一般情况下贪心和排序一起出现&#xff0c;都是先根据条件进行排序&#xff0c;之后基于贪心策略得到最优结果。 面试的时候面试官一般不会出贪…

2024-3-12尾盘一致转分歧

安彩高科开一字符合预期&#xff0c;昨天风光储锂电大涨&#xff0c;理应给大溢价&#xff0c;超预期是 艾艾精工 高开秒板&#xff0c;立航科技高开分歧反核承接良好回封一致&#xff0c;带动了低空经济板块高潮&#xff0c;低空经济开始往 碳纤维 方向扩散。盘中我说了 三晖…

Neo4j 批量导入数据 从官方文档学习LOAD CSV 命令 小白可食用版

学习LOAD CSV&#x1f680; 在使用Neo4j进行大量数据导入的时候&#xff0c;发现如果用代码自动一行一行的导入效率过低&#xff0c;因此明白了为什么需要用到批量导入功能&#xff0c;在Neo4j中允许批量导入CSV文件格式&#xff0c;刚开始从网上的中看了各种半残的博客或者视频…

pytest测试框架使用基础07 fixture—parametrize获取参数的几种常用形式

【pytest】parametrize获取参数的几种常用形式: a.数据结构 b.文件 c.数据库 d.conftest.py配置一、直接在标签上传参 1.1 一个参数多个值 pytest.mark.parametrize("参数", (参数值1, 参数值2, 参数值3))示例&#xff1a; import pytest # 单个参数的情况 pytest.…