大根堆简单的插入和删除的实现

2023-11-15

package com.chenrong.other;

/**
 * @author ChenRong
 * @description: 实现简单的大根堆, 元素从大往小排序
 * @date 2020/4/9 21:08
 */
public class BigHeap {

       // 记录堆内元素的个数,同时下一空元素下标
       private Integer count = 0;

       // 最多装100个元素
       private Integer[] arr = new Integer[100];

       /**
       * @Description 返回大根堆里面的元素个数
       * @param
       * @Return java.lang.Integer
       * @Author ChenRong
       * @Date 2020/4/9 21:13
       **/
       public Integer size(){
              return count;
       }

       /**
       * @Description 往堆里面添加元素
       * @param num
       * @Return java.lang.Integer
       * @Author ChenRong
       * @Date 2020/4/9 21:34
       **/
       public Integer put(Integer num) throws Exception{
              if( count >= 100){
                     throw new Exception("大堆的元素个数已经达到100上限");
              }
              arr[count++] = num;
              // 上浮,最后一个元素的下标为 count - 1
              ShiftUp(arr, count - 1);
              return num;
       }

       /**
       * @Description 清除大根堆 根部的元素
       * @param
       * @Return java.lang.Integer
       * @Author ChenRong
       * @Date 2020/4/9 21:35
       **/
       public Integer remove() throws Exception{

              if(count == 0){
                    throw new Exception("大堆没有任何元素");
              }

              Integer num = arr[0];
              // 首尾交换
              swap(arr, 0, count - 1);
              // 下一空元素的下标减少1
              count--;
              // 下沉, 从根元素开始
              ShiftDown(arr, 0);
              return num;

       }

       /**
       * @Description 添加的元素上浮
       * @param arr
       * @param index 当前元素的下标
       * @Return void
       * @Author ChenRong
       * @Date 2020/4/9 21:32
       **/
       private void ShiftUp(Integer[] arr, Integer index){

              Integer parent = (index - 1) / 2;

              // 当前节点不是根节点
              if (index > 0){

                  if(arr[parent] < arr[index]){
                          swap(arr, parent, index);
                          ShiftUp(arr, parent);
                  }

              }

       }

       /**
       * @Description 元素下沉
       * @param arr
       * @param index 当前元素的下标
       * @Return void
       * @Author ChenRong
       * @Date 2020/4/9 21:32
       **/
       private void ShiftDown(Integer[] arr, Integer index){

              // 左孩子节点
              Integer leftChild = index*2 + 1;
              // 右孩子节点
              Integer rightChild = index*2 + 2;

              // 不存在孩子节点
              if(count <= leftChild){
                       return ;
              }

              if(count <= rightChild){   // 仅有左孩子

                    if(arr[index] < arr[leftChild]){
                             swap(arr, index, leftChild);
                             ShiftDown(arr, leftChild);
                    }

              }else{  // 有左右孩子

                    // 记录最大孩子的下标
                    Integer temp = 0;
                    temp = arr[leftChild] > arr[rightChild] ? leftChild : rightChild;

                    if(arr[index] < arr[temp]){
                             swap(arr, index, temp);
                             ShiftDown(arr, temp);
                    }

              }

       }

       /**
       * @Description 元素的交换
       * @param arr
       * @param i
       * @param j
       * @Return void
       * @Author ChenRong
       * @Date 2020/4/9 22:06
       **/
       private void swap(Integer[] arr, Integer i, Integer j){
                 Integer temp = arr[i];
                 arr[i] = arr[j];
                 arr[j] = temp;
       }

       public static void main(String[] args) throws Exception {

              BigHeap heap = new BigHeap();
              Integer[] arr = new Integer[]{1, -1, 5, 9, 8, -5, 7, 123, -19};
              for(Integer num : arr){
                    heap.put(num);
              }

              System.out.println("元素的个数为:  " + heap.size());

              System.out.println("原来元素的情况:");
              for(Integer num : arr){
                   System.out.print(num + "  ");
              }

              System.out.println("\n");
              System.out.println("排序后元素的情况:");
              while (heap.size() != 0){
                   System.out.print(heap.remove() + "  ");
              }

       }
}

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

大根堆简单的插入和删除的实现 的相关文章

随机推荐

  • Vue3通透教程【二】更高效的构建工具—Vite

    文章目录 写在前面 webpack Vite是什么 使用Vite创建项目 写在最后 写在前面 专栏介绍 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章 应粉丝要求开始更新 Vue3 的相关技术文章 Vue 框架目前的地位大家应该都
  • 2019/10/3 CSP-S 模拟测

    T1 Permut 题意 求 1 n 的排列中逆序对数量为 k 的排列的个数 SOL 排除法我们知道一定不是 O n 的算法 考虑 dp 现在已经有 n 1 的答案了 考虑新加入一个数产生多少新的逆序对 设 dp i j 表示 1 i 的排
  • flea-cache使用之Redis集群模式接入

    Redis集群模式接入 1 参考 2 依赖 3 基础接入 3 1 定义Flea缓存接口 3 2 定义抽象Flea缓存类 3 3 定义Redis客户端接口类 3 4 定义集群模式Redis客户端实现类 3 5 定义Redis集群连接池 3 6
  • DataV:可能是我用过最可怕的数据可视化神器

    每年的双十一 天猫都会在剁手狂欢节中直播战绩 除了可怕的数字之外 不知道大家有没有留意到这些同样可怕的 数据可视化大屏 2015双十一大屏 2016双十一大屏 所谓大屏 顾名思义就是一个 很大的屏 一般应用在交易大厅 展览中心 管控中心 老
  • 关于java中IO的个人理解

    一 什么是java的I O I O中的i为input即输入的意思 O为output输出的意思 所以io为java中数据的输入和输出 这里的数据即包括网络上的数据 socket 也包括本地的文件数据 IO使用流的概念来进行数据的输入和输出也就
  • 希沃展台如何使用_【希沃视频展台--让课堂展示从未如此轻松!】PjTime.COM 综合导购 希沃...

    无论是作业试卷的讲解 还是实验过程展示 课堂展示对于课堂效率的提升始终起着重要的作用 然而目前市场上还是充斥着不少操作复杂 清晰度十分尴尬的展台产品 影响着老师的课堂效果 为此我们特意打造了希沃 7系列视频展台 一款简单又强大的视频展台 希
  • 架构师之道 秒杀系统优化思路

    本文曾在 架构师之路 上发布过 近期支援Qcon AS大会 在微信群里分享了该话题 故对原文进行重新整理与发布 一 秒杀业务为什么难做 1 im系统 例如qq或者微博 每个人都读自己的数据 好友列表 群列表 个人信息 2 微博系统 每个人读
  • Flex布局(一:基本概念和容器属性)

    前言 算上来快2个月没写博客呢 一是赶项目 二是中途接到一个朋友公司需要帮忙 周末都在TA们公司兼职 然后空下来就快12月初 1 Flex 传统的布局方案 基于css盒子模型 float display position TA对于很多特殊布
  • Spring中的AOP

    1 概述 在软件业 AOP为Aspect Oriented Programming的缩写 意为 面向切面编程 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 AOP是OOP的延续 是软件开发中的一个热点 也是Spring框
  • adb install安装流程

    把一个编译好的APK通过 include BUILD PREBUILT 预制到系统中 但是启动后一直crash log中显示 dlopen failed cannot locate symbol 02 25 16 18 20 143 126
  • beyond compare 命令行操作 查找差异文件并导出

    BComp com silent 1 txt 0 2 55 9 1 0 2 55 9 5 2 txt 1 txt 中的是执行脚本 如下 load 1 2 select all filter svn expand all compare ru
  • 【NeRF】原始论文解读

    NeRF Representing Scenes as Neural Radiance Fields for View Synthesis PDF Link 文章目录 NeRF Representing Scenes as Neural R
  • vim一般设置

    如果不知道配置文件及脚本的位置 可以在vim中使用命令 scriptnames 将显示如下路径 etc vimrc usr share vim vim72 syntax syntax vim usr share vim vim72 synt
  • 机器学习(三)机器学习的常用库之Pandas

    python在机器学习领域得到广泛应用的重要原因之一是 python拥有庞大而活跃的第三方程序包 依托这些程序包 用户能够方便的完成绝大多数机器学习任务 1 Pandas库 1 1特点 Pandas是基于Numpy构建的 在Numpy的基础
  • 行业轮动(股票)——Python量化

    行业轮动策略 目录 行业轮动策略 1 原理 行业轮动现象 行业轮动的原因 行业轮动下资产配置 1 美林时钟 大类资产配置 2 策略设计 2 策略思路 3 策略代码 4 回测结果分析与稳健性检验 1 原理 行业轮动现象 在某一段时间内 某一行
  • 【机器学习】数据竞赛知识点:编码、创造和筛选特征

    在机器学习和数据科学领域中 特征工程是提取 转换和选择原始数据以创建更具信息价值的特征的过程 假设拿到一份数据集之后 如何逐步完成特征工程呢 步骤1 特性类型分析 不同类型的特征包含的信息不同的 首先需要按照赛题字段的说明去对每个字段的类型
  • Unity解析和读取文本—— txt 文件

    方法一 在Unity内部文件中加载 使用相对路径 1 首先在Unity的 Assets 目录下新建一个 Resources 文件夹 将需要读取的 txt 文件保存到 Resources 文件夹中 注意 txt 文件必须保存成 UTF 8 的
  • 怎么实现Nginx高可用

    怎么实现Nginx高可用
  • 解决没有rpm的困扰 CentOS7下载RPM及其所有的依赖包

    使用Downloadonly 插件下载 RPM 软件包及其所有依赖包以及利用yum进行所需要的rpm包下载 但在CentOS中没有安装yum相应工具的情况下需要先安装yun工具 建议 先修改yum源 一般我愿意使用阿里巴巴的源 修改yum源
  • 大根堆简单的插入和删除的实现

    package com chenrong other author ChenRong description 实现简单的大根堆 元素从大往小排序 date 2020 4 9 21 08 public class BigHeap 记录堆内元素