利用完全二叉树的性质,如何创建一个大根堆和一个小根堆?

2023-10-27

大根堆

大根堆:每个结点的值不大于他的父亲结点的值

分析如下:

假设对{ 27,15,19,18,28,34,65,49,25,37 }这样一个集合的数据创建成堆;

 

 

代码如下:

//建立大根堆
public class TestHeap{
    public int[] array;
    public int usedSize;//当前有效数组长度
    public TestHeap(){
        this.array = new int[10];
        this.usedSize = 0;
    }
    //初始化数组
    public void InitArray(int[] arrayClone){
        array = Arrays.copyOf(arrayClone, arrayClone.length);
        usedSize = array.length;
    }
    //创建大根堆
    public void createHeap(){
        for(int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--){
            adjustment(parent, usedSize);
        }
    }
    //调整
    public void adjustment(int parent, int len){
        //左子树结点下标
        int child = parent * 2 + 1;
        //调整
        while(child < len){
            //先判断有没有右孩子,如果右,找出最大值
            if(child + 1 < len && array[child] < array[child + 1]){
                child++;//如果右子树大,child++就指向他,如果左子树大,就不用管,直接进行下一步判断交换
            }
            //若左右子树的最大值大于父亲结点则交换
            if(array[child] > array[parent]){
                swap(array, child, parent);
                parent = child;
                child = parent * 2 + 1;
            } else{
                break;
            }
        }
    }
    //交换
    public void swap(int[] array, int child, int parent){
        int tmp = array[child];
        array[child] = array[parent];
        array[parent] = tmp;
    }
}

小根堆

小根堆:每个结点的值不小于他的父亲结点的值

     分析与大根堆类似,只是比较出更小的进行替换

代码如下:

//建立大根堆
public class TestHeap{
    public int[] array;
    public int usedSize;//当前有效数组长度
    public TestHeap(){
        this.array = new int[10];
        this.usedSize = 0;
    }
    //初始化数组
    public void InitArray(int[] arrayClone){
        array = Arrays.copyOf(arrayClone, arrayClone.length);
        usedSize = array.length;
    }
    //创建大根堆
    public void createHeap(){
        for(int parent = (usedSize - 1 - 1) / 2; parent >= 0; parent--){
            adjustment(parent, usedSize);
        }
    }
    //调整
    public void adjustment(int parent, int len){
        //左子树结点下标
        int child = parent * 2 + 1;
        //调整
        while(child < len){
            //先判断有没有右孩子,如果右,找出最小值
            if(child + 1 < len && array[child] > array[child + 1]){
                child++;//如果右子树小,child++就指向他,如果左子树小,就不用管,直接进行下一步判断交换
            }
            //若左右子树的最大值小于父亲结点则交换
            if(array[child] < array[parent]){
                swap(array, child, parent);
                parent = child;
                child = parent * 2 + 1;
            } else{
                break;
            }
        }
    }
    //交换
    public void swap(int[] array, int child, int parent){
        int tmp = array[child];
        array[child] = array[parent];
        array[parent] = tmp;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用完全二叉树的性质,如何创建一个大根堆和一个小根堆? 的相关文章

  • 初识哈夫曼编码

    1 什么是哈夫曼编码 1 什么是编码 编码就是把一些信息比如文字文件 视频文件转成0101的一堆数字存储起来 这些数字就是编码 它们需要满足数字与字符的一一对应关系 当然还必须满足可以由这一堆数字转回到文件信息 这样的编码才是有意义的 2
  • 算法与数据结构(二十五)TopK问题:基于快排的Python模板

    首先 先写partition模板 def partition nums left right pivot nums left 初始化一个待比较数据 i j left right while i lt j while i
  • LeetCode:1038. 从二叉搜索树到更大和树(反向中序遍历 C++、Java)

    目录 1038 从二叉搜索树到更大和树 题目描述 实现代码与解析 dfs 原理思路 1038 从二叉搜索树到更大和树 题目描述 给定一个二叉搜索树 root BST 请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和 提醒一
  • 分治-归并排序

    文章目录 315 计算右侧小于当前元素的个数 1 题目 2 算法原理 3 代码实现 493 翻转对
  • 算法题-简单系列-04-链表中倒数最后k个结点

    文章目录 1 题目 1 1 快慢指针 1 题目 输入一个长度为 n 的链表 设链表中的元素的值为 ai 返回该链表中倒数第k个节点 如果该链表长度小于k 请返回一个长度为 0 的链表 1 1 快慢指针 代码中的类名 方法名 参数名已经指定
  • 基于Java的数据结构精品课程教学网站

    收藏关注不迷路 源码文章末 文章目录 前言 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 前言 本基于Java的数据结构精品课程教学网站是根据当前教学大环境相关的内容实际情况开发的 在系统语言选择上我们使
  • D (1173) : A DS二叉树_合并二叉树

    文章目录 一 题目描述 二 输入与输出 1 输入 2 输出 三 参考代码 一 题目描述 给定两个二叉树 输出这两个二叉树合并后形成的二叉树 依次输出前序遍历 中序遍历 后序遍历 二 输入与输出 1 输入 第一行输入t 表示有t个测试样例 第
  • 不会做的题汇总

    摘苹果 题目描述 小红来到苹果园 帮园长摘苹果 园长请小红把摘完的苹果的最小的那个去掉 如果有 多个最小的苹果 那么都要去掉 剩余的苹果算一下平均一个苹果有多重 平均重 量请保留1位小数 输入 输入有2行 第一行 一个整数n代表小红摘的n个
  • 八大排序(希尔排序)

    上篇文章我们来看了看插入排序是怎么实现的 本章内容就是在插入排序的基础上完成希尔排序 希尔排序是一个比较强大的排序 我们希尔排序的时间复杂度是比较难算的 这里直接给出的结论就是时间复杂度就是O N 1 3 比较难算的原因就是我们每一次的次数
  • c 关于数组几个查序程序

    1 查询某元素是否在数组中 int main void char i 10 2 1 7 2 10 5 2 0 1 4 10 10 1 3 1 0 8 char z 10 1 2 3 4 1 4 6 8 0 9 int zz 0 标志位 0
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • DS八大排序之冒泡排序和快速排序

    前言 前两期我们已经对 插入排序 直接插入排序和希尔排序 和 选择排序 直接选择排序和堆排序 进行了详细的介绍 这一期我们再来详细介绍一组排序 交换排序 即耳熟能详的冒泡排序和赫赫有名的快速排序 本期内容介绍 冒泡排序 快速排序 Hoare
  • 面试150-13(Leetcode238除自身以外数组的乘积)

    代码 class Solution public int productExceptSelf int nums int n nums length int res new int n int product 1 int zerocnt 0
  • 代码随想录算法训练营第42天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

    416 分割等和子集 已解答 中等 相关标签 相关企业 给你一个 只包含正整数 的 非空 数组 nums 请你判断是否可以将这个数组分割成两个子集 使得两个子集的元素和相等 示例 1 输入 nums 1 5 11 5 输出 true 解释
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • Leetcode 45 跳跃游戏 II

    题意理解 给定一个长度为 n 的 0 索引 整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 还是从初始坐标i 0的位置到达最后一个元素 但是问题不是能不能跳到 而是 最少几步能跳到最
  • LeetCode 2397. 被列覆盖的最多行数,状态压缩优化回溯法

    一 题目 1 题目描述 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆盖 则认为这
  • 数据结构——排序

    前言 哈喽小伙伴们好久不见 也是顺利的考完试迎来了寒假 众所周知 不怕同学是学霸 就怕学霸放寒假 假期身为弯道超车的最佳时间 我们定然是不能懒散的度过 今天我们就一起来学习数据结构初阶的终章 七大排序 本文所有的排序演示都为升序排序 目录
  • 用栈实现队列(OJ中报错的处理)

    用栈实现队列 ERROR AddressSanitizer myQueueFree函数中栈的释放处现了问题 没有调用StackDestory而是直接free了 这个是栈初始化时 capacity与malloc申请的空间大小没有匹配 请你仅使

随机推荐

  • Aix 压缩、打包、解压、解包 tar zip gz

    tar是打包 zip和gz是压缩 打包 tar cf all tar 解包 tar xvf tar 解压zip文件 jar xvf DB29 5 AIX zip 解压gz文件 usr bin gzip d tar gz
  • highcharts使用韦恩图报错解决Error in mounted hook: “Error: Highcharts error #17:missingModuleFor: venn(详细步骤)

    我由于在vue项目中刚好要使用韦恩图想用highcharts然后按照步骤 1 npm install highcharts save 2 创建组件
  • Mac使用技巧:轻松自定义设置系统键盘

    为你带来Mac OS系统和windows系统如何键盘自定义设置教程 感兴趣可以看看哦 一 mac系统下如何将外接键盘设置成和苹果键盘一样 首先打开mac系统设置里的 键盘 点击 修饰键 选择 usb键盘 然后 option 和 comman
  • 瓦片地图-坐标转换

    先明确三点 1 屏幕坐标是以左上角为原点 而cocos2dx坐标即opengl坐标体系 是以左下角为原点 2 tile地图坐标是以左上角或上方 45 为原点 tile瓦片的默认锚点是左下角 一 地图坐标 Tiled地图一般常见的有3种不同的
  • 【STC15单片机】独立按键显示二进制

    目录 按键选择 按键抖动 独立按键控制8个LED实现二进制显示 显示二进制的程序 单片机型号说明 IAP15F2K61S2 新建工程时单片机型号选择STC15F2K60S2 键盘的分类 键盘分编码键盘和非编码键盘 键盘上闭合件的识别由专用的
  • Python 中的八大关键要素

    阅读本文需要 10 分钟 前言 学习任何一门语言之前 你得先了解它的整体架构 知道它的思想 了解它的关键要素 一门语言学到后来你会发现 就像是在剥茧抽丝一般 越是深入越是发现其奥妙之处 Python 中的八大关键要素 Python 是一种D
  • 云服务器中如何创建共享文件夹,云服务器中如何创建共享文件夹

    云服务器中如何创建共享文件夹 内容精选 换一换 当您有如下需求时 可以考虑使用文件注入功能将文件注入到弹性云服务器 需要通过脚本简化弹性云服务器配置通过脚本初始化系统已有脚本 在创建弹性云服务器的时候一并上传到服务器其他可以使用脚本完成的事
  • css-滚动条样式设置

    滚动条产生原因 给能设置宽高的元素添加 overflow scroll 样式 会让该元素区域产生滚动条 滚动条默认样式 以下行文案例皆是在 Edge 浏览器环境下测试 设置滚动条样式 通过设置 webkit scrollbar 伪元素影响滚
  • java设计模式——原型模式(Prototype Pattern)

    概述 在使用原型模式时 我们需要首先创建一个原型对象 再通过复制这个原型对象来创建更多同类型的对象 需要注意的是通过克隆方法所创建的对象是全新的对象 它们在内存中拥有新的地址 通常对克隆所产生的对象进行修改对原型对象不会造成任何影响 每一个
  • 项目管理和产品管理

    本文翻译至 http www tenstep jp cms project management value html start 8 A5 3 项目管理和产品管理 项目和产品 A5 3 P1 项目 是为了执行新工作的交付手段 所有的组织里
  • 【论文精读】Is Synthetic data from generative models ready for image recognition? 生成数据对图像识别的影响

    标题 扩散模型生成数据对图像识别的影响 1 总体介绍 发展现状 扩散模型已经可以生成高质量的样本 之前有人研究过生成数据对cv的作用 但是局限于小领域和小规模 研究目的 扩散样本对视觉领域的作用 手工标注的样本昂贵 有隐私和安全风险 探讨方
  • 凹凸世界服务器维护到几点,凹凸世界6月10日版本更新停服维护公告_凹凸世界6月10日版本更新了什么_玩游戏网...

    在凹凸世界手游中6月10日版本究竟更新了什么呢 更新的内容又有哪些呢 不清楚的话 接下来就让我们一起来看一下吧 亲爱的天使 感谢您对 凹凸世界 手游的关注与支持 为了给各位天使带来更好的游戏体验 不断地丰富游戏内容 凹凸世界 手游将于6月1
  • VLAN基础知识和配置

    分割广播的方式 物理分割 子网划分 逻辑分割 VLAN VLANy优势 1 控制广播 每一个vlan都是一个独立的广播域 这样就减少了广播对网络宽带的占用 提高了网络传输效率 并且一个VLAN出现了广播风暴不会影响其他的VLAN 2 增强网
  • 分布式应用:Zabbix监控MariaDB

    目录 一 理论 1 Zabbix监控MariaDB 二 实验 1 Zabbix监控MariaDB 一 理论 1 Zabbix监控MariaDB 1 环境 zabbix服务端 192 168 204 214 zabbix客户端 192 168
  • MatLab中的fft变换(快速傅里叶变换)

    本文章内容只作为个人学习总结使用 目录 说明 基本的FFT使用方法 1 简单的FFT功能介绍 2 恢复幅度轴 创建频率轴 说明 本文章主要进行MATLAB中fft函数基本使用方法的讨论 关于fft的概念以及为什么要进行fft等信号处理方面的
  • bugku 奇怪的密码

    a gndk rlqhmtkwwp z key 1 b for i in a b chr ord i key key key 1 print b
  • C++回顾录03-C++类和对象

    类是创建对象的模板 一个类可以创建多个对象 每个对象都是类类型的一个变量 创建对象的过程也叫类的实例化 每个对象都是类的一个具体实例 Instance 拥有类的成员变量和成员函数 类是用户自定义的类型 如果程序中要用到类 必须提前说明 或者
  • 数学建模_论文写作要求

    标题 副标题 基于XX 模型 方法 对xx的问题研究 可加副标题 xxx gt 三号黑体字 一级标题 四号黑体 居中 二级 三级标题 小四黑体 左对齐 其他字体 小四宋体 行距用单倍行距 设置文字时先选择样式再调整样式 总页数在25 35之
  • 【数字信号处理】带通采样定理及其MATLAB仿真

    目录 一 带通采样定理 1 1 内容 1 2 公式推导 二 MATLAB信号仿真 2 1 信号仿真实验 2 2 MATLAB代码 三 总结 参考 一 带通采样定理 按照奈奎斯特采样定理 低通采样 采样频率 f s f s fs 要大于等于信
  • 利用完全二叉树的性质,如何创建一个大根堆和一个小根堆?

    大根堆 大根堆 每个结点的值不大于他的父亲结点的值 分析如下 假设对 27 15 19 18 28 34 65 49 25 37 这样一个集合的数据创建成堆 代码如下 建立大根堆 public class TestHeap public i