/*************************************
* BinaryHeap 二叉堆(最小二叉堆 + 最大二叉堆)
* 1、Push
* 2、Pop
* 3、MinComp
* 4、MaxComp
* 5、Clear
* 6、IsEmpty
* 7、HeapSize
*
* 二叉堆:快速排序方式,减少了排序时间复杂度
*/
using UnityEngine;
using System.Collections;
public class BinaryHeap
{
public const int MAX_SIZE = 512;
public int HeapSize{get; private set;}
private int[] _HeapArray;
public BinaryHeap()
{
Clear();
_HeapArray = new int[MAX_SIZE];
}
public void Clear()
{
HeapSize = 0;
}
public bool IsEmpty{get{return HeapSize == 0;}}
private bool MinComp(int x, int y)
{
return x < y;
}
private bool MaxComp(int x, int y)
{
return x > y;
}
// 添加新元素,采用冒泡法
public void Push(int x)
{
//首先将 元素放到列表最后面
HeapSize++;
_HeapArray[HeapSize] = x;
// 递归的和其父节点比较,如果,小于父节点就和父节点交换,直至大于等于父节点的值
int i = 0;
for(i = HeapSize; i > 0; i = i/ 2)
{
int parentIndex = i/2;
if(parentIndex <= 0)
{
break;
}
if(MinComp(x, _HeapArray[parentIndex]))
{
_HeapArray[i] = _HeapArray[parentIndex];
}
else
{
break;
}
}
_HeapArray[i] = x;
}
// 删除元素,采用向下沉的方式
public int Pop()
{
if(IsEmpty)
{
return -1;
}
// 取出第一个元素
int popNum = _HeapArray[1];
if(HeapSize == 1)
{
HeapSize--;
return popNum;
}
// 取出最后一个元素
int lastNum = _HeapArray[HeapSize];
HeapSize--;
// 采用向下沉的方式向下沉
int i = 1;
for(; i <= HeapSize;)
{
// 如果两个子节点存在,就挑选其中较小的值作为父节点的值
if((2 * i + 1) <= HeapSize)
{
int index = MinComp(_HeapArray[ 2* i], _HeapArray[2 * i + 1])? (2 * i): (2 * i + 1);
if(MinComp(_HeapArray[index], lastNum))
{
_HeapArray[i] = _HeapArray[index];
i = index;
}
else
{
break;
}
}
else if((2 * i) <= HeapSize && MinComp(_HeapArray[2 * i], lastNum))
{
_HeapArray[i] = _HeapArray[ 2 * i];
i = 2 * i;
}
else
break;
}
_HeapArray[i] = lastNum;
return popNum;
}
}
相关推荐
从零配置华为S5720交换机VLAN:Web界面与命令行双模式详解(附拓扑图)
本文详细解析华为S5720交换机VLAN配置的全过程,涵盖Web界面与命令行(CLI)双模式操作指南。从基础环境准备到多交换机环境配置同步,特别针对S5720-52X系列交换机的VLANif接口、端口分配策略及交换机堆叠技术进行深入讲解,并附实用拓扑图与配置示例,助力企业网络管理员高效完成VLAN部署。
Unity的二叉堆优先队列
【代码】Unity的二叉堆优先队列。
如何判断一个程序员的技术比你强?
技术大佬与普通程序员之间存在明显的认知差异:前者善于将复杂问题抽象为经典计算机科学问题,用声明式代码替代过程式逻辑;对异常和边界条件极度敏感,具备系统化的排查方法论;代码追求高可读性而非炫技,且执着于底层原理研究。这种技术压制体现在解决问题的确定性上——通过扎实的理论功底和工程直觉,快速定位问题本质,而非依赖试错或搜索。真正的技术实力源于对底层逻辑的深刻理解和对系统稳定性的敬畏。
二叉堆(BinaryHeap)的一种C#实现
二叉堆(BinaryHeap)的一种C#实现 最近项目里用到了寻路,可以用两种算法实现,迪杰斯特拉和AStar。其中AStar是迪杰斯特拉算法的一种改进,所以使用更广泛一点。这篇文章不讨论这两种算法,而聚焦于这两种算法中都用到的一种数据结构——二叉堆(BinaryHeap)。 在这两种算法中的性能瓶颈最可能发生在从”开表”中取出路径最短的节点,也就是从一个集合中取出最小元素。最简单的方法当然就是对...
AWS RDS 介绍 三)创建 RDS 实例
AWS RDS 介绍 共分为 7 个部分, 其中 第 3部分重点介绍,如何创建一个RDS 实例。 三) AWS RDS 试用MySQL http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.
从零构建PEMFC仿真模型:MATLAB/Simulink中的模块化拆解与系统集成
本文详细介绍了如何在MATLAB/Simulink环境中从零构建质子交换膜燃料电池(PEMFC)仿真模型,包括电化学模型、气体供应系统和热管理系统的模块化实现。通过多物理场耦合技巧和系统集成策略,帮助工程师和研究者高效开发PEMFC控制策略,优化性能并实现实时仿真。
Unity3D A 星寻路(A*) C# 版本
转载:http://www.gopedu.com/article/735 因为项目需要做一个 A 星寻路的功能,但是又不想用 Unity3D 中的 A 星寻路插件,因为感觉插件感觉不够灵活,不能符合自己的设计,还好以前就保留了一位前辈的高效 A 星寻路链接,不过作者是用的 ActionScript 编写的,所以我就整理成了 C# 版本的了。 最终效果图
我的世界模组开发——前言
避坑:在开发过程中一定不要过分依赖AI,虽说现在的人工智能很厉害,但是也有很大的弊端,很多AI生成的代码错误百出,还得自己修改,而且像deepseek这种AI的训练数据还停留在一年前,给出的maven仓库地址都是过时的甚至是错误的,开发模组就是要多学习,多看源码,这样开发模组的水平才能越来越高。总而言之,build.gradle文件在我的世界Forge模组开发中扮演了重要的角色,它定义了项目的构建过程、依赖关系和编译选项,为开发者提供了灵活而强大的构建工具。开发工具推荐使用idea,因为可以使用通灵义码。
漫画:什么是二叉堆?(修正版)
https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195207&idx=2&sn=12689c6c1a92e7ec3cce4d423019ec2a&chksm=8c99f91dbbee700b8e760d06b27582037ab0713295dacf2b5a7a7f954c0032fe860aa0b...
【Docker安装】OpenEuler系统下部署Docker环境
【Docker安装】OpenEuler系统下部署Docker环境
AI智能体实战:从LangChain到多智能体协作的自动化新范式
在人工智能技术快速发展的今天,大语言模型(LLM)已成为推动自动化变革的核心驱动力。其原理在于通过深度学习海量文本数据,使模型能够理解、生成自然语言并执行推理任务。这一技术进步催生了AI智能体(AI Agent)这一新兴概念,它赋予自动化系统自主决策和动态规划能力,从而突破了传统脚本和RPA工具在固定流程上的局限。从技术价值看,AI智能体框架通过封装LLM调用、工具集成与流程编排,显著降低了构建复杂人机协同应用的开发门槛。在实际应用场景中,智能体尤其擅长处理信息调研、内容创作辅助、数据分析等需要处理非结构化
C#实现优先队列 基于二叉堆 附使用案例
前言 想用下C#的优先队列,结果发现居然没有,简直蛋疼。。。 感谢 http://www.cnblogs.com/skyivben/archive/2009/04/18/1438731.html 博主的实现 我借用博主的优先队列实现,写了测试程序,感觉还可以,这里放出来当个使用案例吧~ 转载实现using System; using System.Collections.Generic; using
华为OD机考双机位C卷 - 打印机队列 (Java & Python& JS & C/C++ & GO )
华为OD机考双机位C卷 - 打印机队列
【二叉堆】二叉堆的实现
文章目录一.简介 一.简介 二叉堆支持插入、删除、查询最值,和stl库中的优先队列类似。相比优先队列,二叉堆还可以支持删除特定结点的操作,但是写法繁琐,因此应用不多。
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
二叉堆的实现
文章目录介绍实现原理代码实现(C++)最大堆最小堆 介绍 二叉堆是完全二元树或者近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。 最大堆:父节点的键值总是大于或等于任何一个子节点的键值。 最小堆:父节点的键值总是小于或等于任何一个子节点的键值。 实现原理 1、二叉堆一般使用数组实现,如果从索引1开始存放元素,那么 i 的左孩子是2*i i 的右孩子是2*i+1 i 的父节点 ...
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
java 二叉堆_二叉堆的介绍和Java实现
一、堆和二叉堆堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序实现的。按照排列的顺序可以分为最大堆和最小堆,最大堆的特征是父节点一定大于(依据情况判断是大于等于还是严格大于,数据结构归根到底还是用来使用的)子节点的数据。同样,有最大堆就会有最小堆,最小堆的 父节点...
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
c++实现二叉堆及堆排序
一、什么是二叉堆
java 二叉堆_二叉堆(三)之 Java的实现
概要前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本。还是那句话,它们的原理一样,择其一了解即可。二叉堆的介绍二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。二叉堆一般都通过"数组"来实现,下面是数组实现的最大堆和最小堆的示意图:二...
二叉堆时间复杂度 php,二叉堆的实现
三篇文章我们讲解了优先队列,这节主要讲解二叉堆的实现,通过二叉堆来实现优先队列,废话不多说,我们开始堆作为优先队列的底层结构,使得入队和出队操作时间复杂度都在O(logn)什么是二叉堆?之前我们学习过二叉树,没有了解过二叉堆,从意义字面上还有点相同之处,都有“二叉”两个字(滑稽)像上图这样的树型结构就是二叉堆,也看不出什么区别啊,就是节点元素值比左孩子小比右孩子大嘛,和二分搜索树一样了。仔细一看还...
Dart实现二叉堆
定义与原理 二叉堆是一种特殊的堆。具有如下的特性: 具有完全二叉树的特性 堆中的任何一个父节点的值都大于等于它左右孩子节点的值,或者都小于等于它左右孩子节点的值 二叉堆分为两类: 最大堆 父节点的值大于等于左右孩子节点的值 最小堆 父节点的值小于等于左右孩子节点的值 堆顶:二叉堆的根节. 二叉堆的三个主要操作: 插入一个节点。 删除一个节点。 构建一个二叉堆。 在二叉堆这种结构中,...
使用Java实现二叉堆
本文详细介绍了二叉堆的基本原理和主要操作,并使用Java编程语言实现了一个简单的二叉堆。二叉堆是一种非常有用的数据结构,常用于实现优先队列等算法。通过本文的学习,读者应该能够理解二叉堆的工作原理,并能够在自己的项目中使用它。
二叉堆的c++实现
/************************************************************************ &gt; File Name: BinaryHeap.cpp &gt; Author: wpf &gt; Mail: wpf9264@163.com &gt; Created Time: 2019年03月04日 星期一...
二叉堆代码实现
文章目录1.简介2.二叉堆的代码实现2.1 构建堆2.2 上浮调整2.3 下沉调整2.4 测试方法 1.简介 二叉堆本质上是一棵完全二叉树,它分为最大堆和最小堆。最大堆就是它里面的任何一个父节点的值,都大于或者等于它的左、右孩子节点的值。最小堆就是其中的任何一个父节点的值都小于或者等于它左、右孩子节点的值。二叉堆中的根节点叫做堆顶,最大堆和最小堆决定了:最大堆的堆顶是整个堆中最大的元素,最小堆的堆顶是整个堆中最小的元素。 2.二叉堆的代码实现 二叉堆虽然是一棵完全二叉树,但是它的存储方式并不是链式存储
java 实现最小二叉堆排序
写在前面: 一觉醒来,我就突然有灵感了...... 最小二叉堆定义: 二叉堆是完全二元树或者是近似完全二元树,最小二叉堆是父结点的键值总是小于或等于任何一个子节点的键值的堆堆。 存储: 二叉堆一般用数组来表示。 根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2; 位置k的叶子的父节点位置为(k-1)/2; 实现: Java
1370



被折叠的 条评论
为什么被折叠?



