当前位置: 首页 > news >正文

如何构建最小堆?

方式1:上浮调整

/*** 上浮调整(小的上浮)*/
public static void smallUp1(int[] arr, int child) {int parent = (child - 1) / 2;while (0 < child && arr[child] < arr[parent]) { // 0 < child说明这个节点还是叶子arr[child] = arr[child] ^ arr[parent];arr[parent] = arr[child] ^ arr[parent];arr[child] = arr[child] ^ arr[parent];child = parent;                             // 父节点此时开始视为子节点parent = (child - 1) / 2;                   // 算父节点的父节点}
}
/*** 上浮调整(小的上浮)*/
public static void smallUp2(int[] arr, int child) {int parent = (child - 1) / 2;int baseVal = arr[child];                       // 把处理的数据取出来while (0 < child && baseVal < arr[parent]) {arr[child] = arr[parent];                   // 父节点值挪下来,父节点为baseVal备选位置child = parent;parent = (child - 1) / 2;}arr[child] = baseVal;                           // baseVal上浮不动了,所以落在当前子节点位置
}

方式2:下沉调整

/*** 下浮调整(大的下沉)** @param arr    待调整的堆* @param parent 要下沉的父节点* @param length 堆的有效大小*/
public static void bigDown1(int[] arr, int parent, int length) {int child = 2 * parent + 1;while (child < length) { // 范围内if (child + 1 < length && arr[child + 1] < arr[child]) { // 取出两个子节点值最小的那个child++;}if (arr[parent] <= arr[child]) {       // 父节点比他们都小,则符合预期终止循环break;}arr[child] = arr[child] ^ arr[parent];arr[parent] = arr[child] ^ arr[parent];arr[child] = arr[child] ^ arr[parent];parent = child;                         // 此时子节点视为父节点继续下一步处理child = 2 * child + 1;}
}
/*** 下浮调整(大的下沉)** @param arr    待调整的堆* @param parent 要下沉的父节点* @param length 堆的有效大小*/
public static void bigDown2(int[] arr, int parent, int length) {int baseVal = arr[parent];int child = 2 * parent + 1;while (child < length) {if (child + 1 < length && arr[child + 1] < arr[child]) {child++;}if (baseVal <= arr[child]) {break;}arr[parent] = arr[child]; // 子节点小,则子节点位置上移parent = child;child = 2 * child + 1;}arr[parent] = baseVal;        // baseVal下沉不动了,所以落在当前子节点位置
}

构建最小堆

int[] arr = {1, 3, 2, 9, 5, 7, 8, 6, 10, 0};System.out.println("原始数据:" + Arrays.toString(arr));
for (int i = arr.length - 1; i >= 0; i--) {smallUp1(arr, i);
}
System.out.println("上浮构建最小二叉堆:" + Arrays.toString(arr));int[] arr2 = {1, 3, 2, 9, 5, 7, 8, 6, 10, 0};
for (int i = arr2.length - 1; i >= 0; i--) {smallUp1(arr2, i);
}
System.out.println("上浮构建最小二叉堆:" + Arrays.toString(arr2));int[] arr11 = {1, 3, 2, 9, 5, 7, 8, 6, 10, 0};
for (int i = (arr11.length - 1) / 2; i >= 0; i--) {bigDown1(arr11, i, arr11.length);
}
System.out.println("下沉构建最小二叉堆:" + Arrays.toString(arr11));int[] arr22 = {1, 3, 2, 9, 5, 7, 8, 6, 10, 0};
for (int i = (arr22.length - 1) / 2; i >= 0; i--) {bigDown2(arr22, i, arr22.length);
}
System.out.println("下沉构建最小二叉堆:" + Arrays.toString(arr22));原始数据:[1, 3, 2, 9, 5, 7, 8, 6, 10, 0]
上浮构建最小二叉堆:[0, 1, 2, 6, 3, 7, 8, 9, 10, 5]
上浮构建最小二叉堆:[0, 1, 2, 6, 3, 7, 8, 9, 10, 5]
下沉构建最小二叉堆:[0, 1, 2, 6, 3, 7, 8, 9, 10, 5]
下沉构建最小二叉堆:[0, 1, 2, 6, 3, 7, 8, 9, 10, 5]

相关文章:

  • 爬虫学习--18.反爬斗争 selenium(3)
  • Inno Setup磁盘跨越必须启用,因为程序大于21000000000
  • 解析Java中1000个常用类:Error类,你学会了吗?
  • 考CCIE的难点在哪?英语不好?
  • 等保系列之——网络安全等级保护测评工作流程及工作内容
  • 解决 git 命令 Problem with the SSL CA cert (path? access rights?)
  • 反射、类加载、静态代理,jdk动态代理,cglib代理
  • java8 stream流的用法
  • 命令模式(行为型)
  • spring分析工具_springboot startup analyze的部署和使用
  • 「vue同一个组件,不同路由切换时界面没有更新问题」
  • mysql - 为什么MySQL不建议使用NULL作为列默认值?
  • git仓库迁移
  • 【Linux】操作系统之冯诺依曼体系
  • 用HAL库改写江科大的stm32入门-6-3 PWM驱动LED呼吸灯
  • 【Leetcode】101. 对称二叉树
  • 【个人向】《HTTP图解》阅后小结
  • 2018一半小结一波
  • java8 Stream Pipelines 浅析
  • Just for fun——迅速写完快速排序
  • MySQL主从复制读写分离及奇怪的问题
  • PHP的Ev教程三(Periodic watcher)
  • PHP那些事儿
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Vue全家桶实现一个Web App
  • 基于web的全景—— Pannellum小试
  • 技术发展面试
  • 积累各种好的链接
  • #WEB前端(HTML属性)
  • (55)MOS管专题--->(10)MOS管的封装
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (篇九)MySQL常用内置函数
  • (已解决)什么是vue导航守卫
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .Net 基于MiniExcel的导入功能接口示例
  • .net 受管制代码
  • .net(C#)中String.Format如何使用
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net组件程序设计之线程、并发管理(一)
  • @RequestMapping 和 @GetMapping等子注解的区别及其用法
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20180224]expdp query 写法问题.txt
  • [Armbian] 部署Docker版Home Assistent,安装HACS并连接米家设备
  • [BZOJ2850]巧克力王国
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [C#学习笔记]注释