Java实现二叉堆构建、上浮、下沉

2023-10-19 02:10

本文主要是介绍Java实现二叉堆构建、上浮、下沉,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二叉堆分最小堆、最大堆,是优先队列实现的基础 ,下图是我整理的基本的知识图:
在这里插入图片描述
对于java实现最小二叉堆的下沉、上浮、构建代码例子如下:

import java.util.Arrays;/*** 最小二叉堆构建、上浮、下沉的实现Demo*/
public class BinaryHeapDemo {/*** (最小堆)上浮:跟父节点比较,如果小于父节点,则进行上浮;注意需要判断节点是属于左节点还是右节点** @param arr*/public static void upAdjust(int[] arr) {int childIdx = arr.length - 1;//如果子节点索引是偶数,则是又节点,否则是左节点int parentIdx = (childIdx % 2 == 0 ? (childIdx - 2) / 2 : (childIdx - 1) / 2);int temp = arr[childIdx];while (childIdx > 0 && temp < arr[parentIdx]) {arr[childIdx] = arr[parentIdx];childIdx = parentIdx;parentIdx = (childIdx % 2 == 0 ? (childIdx - 2) / 2 : (childIdx - 1) / 2);}arr[childIdx] = temp;}/*** (最小堆)下沉:根节点跟左右节点最小的比较,如果大于最小节点则进行下沉;** @param arr*/public static void downAdjust(int[] arr, int parentIdx) {int tmp = arr[parentIdx];int childIdx = getChildIdx(arr, parentIdx);while (childIdx < arr.length && tmp > arr[childIdx]) {arr[parentIdx] = arr[childIdx];parentIdx = childIdx;childIdx = getChildIdx(arr, parentIdx);}arr[parentIdx] = tmp;}/*** 根据数组及父节点的索引获取对应的子节点索引** @param arr* @param parentIdx* @return*/private static int getChildIdx(int[] arr, int parentIdx) {int childIdx;int leftIdx = 2 * parentIdx + 1;//判断是否存在左右节点,及左右节点最小的是哪个节点if (leftIdx < arr.length) {int rightIdx = 2 * parentIdx + 2;if (rightIdx >= arr.length) {childIdx = leftIdx;}if (arr[rightIdx] > arr[leftIdx]) {childIdx = leftIdx;} else {childIdx = rightIdx;}} else {childIdx = leftIdx;}return childIdx;}/*** 构建最小二叉堆:让所有非叶子节点依次下沉,从最后一个非叶子节点开始** @param arr*/public static void buildBinaryHeap(int[] arr) {int idx = (arr.length - 1) % 2 == 0 ? (arr.length - 3) / 2 : (arr.length - 2) / 2;for (int i = idx; i >= 0; i--) {downAdjust(arr, i);}}public static void main(String[] args) {int[] arr = new int[]{1, 3, 2, 6, 5, 7, 8, 9, 10, 9, 6, 5};System.out.println("上浮前数组:");System.out.println(Arrays.toString(arr));upAdjust(arr);System.out.println("上浮后数组:");System.out.println(Arrays.toString(arr));arr = new int[]{10, 3, 2, 6, 5, 7, 8, 9};System.out.println("下沉前数组:");System.out.println(Arrays.toString(arr));downAdjust(arr, 0);System.out.println("下沉后数组:");System.out.println(Arrays.toString(arr));arr = new int[]{7, 1, 3, 10, 5, 2, 8, 9, 6};System.out.println("构建前数组:");System.out.println(Arrays.toString(arr));buildBinaryHeap(arr);System.out.println("构建后数组:");System.out.println(Arrays.toString(arr));}}

执行结果:

上浮前数组:
[1, 3, 2, 6, 5, 7, 8, 9, 10, 9, 6, 5]
上浮后数组:
[1, 3, 2, 6, 5, 5, 8, 9, 10, 9, 6, 7]
下沉前数组:
[10, 3, 2, 6, 5, 7, 8, 9]
下沉后数组:
[2, 3, 7, 6, 5, 10, 8, 9]
构建前数组:
[7, 1, 3, 10, 5, 2, 8, 9, 6]
构建后数组:
[1, 5, 2, 6, 7, 3, 8, 9, 10]

如有问题,欢迎指导!

这篇关于Java实现二叉堆构建、上浮、下沉的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/236604

相关文章

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2