概念:

最大堆是堆的两种形式之一。
根节点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆(大顶堆)。

实现方法(java):

可以自己写一个类,包含左节点和右节点,但是在这里我并没有使用这种方法,却用了一种比较经典的方法,使用数组来实现这个最大堆,其中我并没有使用下标为0的位置,是从1开始的.

  1. 通过构造方法在插入时就保持整个数组为最大堆;
  2. 将堆中的最大值拿出,并使数组实时保持最大堆;
  3. 实现未经过优化的堆排序,对一个无序数组进行堆排序;

性质:

根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值

核心方法:

  1. shiftUp() :在动态的插入数据时保持整体满足最大堆
  2. shiftDown(int i) :使数组中以i为下标的堆满足最大堆

结果截图:

代码展示:

public class Main { public static void main(String args[]) { Tools tools = new Tools(); //工具类,用于创建随机数数组 //测试1:动态插入数据 System.out.println("1:动态插入数据,获得随机数组并打印"); int[] data = tools.create_int_random(20, 10, 99); for (int i = 0; i < data.length; i++) { System.out.print(data[i] + " "); } //获得随机数组,而且打印初始数组 MaxHeap maxHeap = new MaxHeap(); System.out.println(); maxHeap.insert(data); System.out.println("动态插入后的数组"); maxHeap.print_data(); //将构成的最大堆打印并验证 System.out.println(); System.out.println(); //测试2:将堆中最大的值弹出,并实时保持数组满足最大堆 System.out.println("2:将堆中最大的值弹出,并实时保持数组满足最大堆"); for (int i = 0; i < data.length; i++) { System.out.print(maxHeap.get_Max() + " "); } System.out.println(); //测试3:未优化的堆排序 System.out.println("3:获得随机数组并打印"); int[] data1 = tools.create_int_random(20, 10, 99); for (int i = 0; i < data1.length; i++) { System.out.print(data1[i] + " "); } MaxHeap maxHeap1 = new MaxHeap(data1, data1.length); System.out.println("打印结果"); maxHeap1.print_data_as_array(); } } class MaxHeap { private int data[]; private int count = 0; MaxHeap(int number) { data = new int[number]; } MaxHeap() { data = new int[200]; } /** * 作为检测堆排序的构造方法 * * @param arr * @param number */ MaxHeap(int[] arr, int number) { data = new int[number + 1]; count = number; for (int i = 0; i < arr.length; i++) { data[i + 1] = arr[i]; } for (int i = count / 2; i >= 1; i--) { shifDown(i); } } void insert(int[] num) { int item; for (int i = 0; i < num.length; i++) { item = num[i]; count++; data[count] = item; shiftUp(item); } } /** * 返回最大值 */ int get_Max() { if (count > 0) { int resoult = data[1]; data[1] = data[count]; count--; shifDown(1); return resoult; } return -1; } /** * 在动态的插入数据时保持整体满足最大堆 * * @param num */ private void shiftUp(int num) { int position = count / 2; while (data[position] < num && position != 0) { //让 data[count/2] 与data[count] 交换位置,其中data[count] 之前是num int middle = data[position]; data[position] = num; data[count] = middle; //如果没有下面这步的话,不会进行二次的变化 num = data[position]; position /= 2; } } /** * 使数组中以num为下标的堆满足最大堆 * * @param num */ private void shifDown(int num) { while (2 * num <= count) { int j = 2 * num; //j 为要进行交换的下标 if (j + 1 <= count && data[j + 1] > data[j]) { j += 1; } if (data[num] >= data[j]) { break; } /*交换data[num]与data[j]*/ int middle = data[num]; data[num] = data[j]; data[j] = middle; num = j; } } /** * 打印结果 */ void print_data() { int number = 0; int line = 1; for (int i = 1; i < count; i++) { System.out.print(data[i] + " "); number++; if (number == line) { System.out.println(); line = line * 2; number = 0; } } } void print_data_as_array() { for (int i = 1; i < data.length; i++) { System.out.print(data[i] + " "); } } } 

java数据结构--最大堆相关推荐

  1. Java数据结构之堆(Heap)

    文章目录 一.基本概念 二.上浮操作(siftUp) 三.下沉操作(siftDown) 四.数组堆化 五.实现大根堆 提示:以下是本篇文章正文内容,Java系列学习将会持续更新 一.基本概念 堆在逻辑 ...

  2. 【Java面试高频问题】Java数据结构和算法基础知识汇总

    文章目录 Java数据结构和算法基础知识 一.Java数据结构 1. 线性结构:数组.队列.链表和栈 1.1 数组(Array) 1.2 稀疏数组 1.3 队列(Queue) 1.4 链表(Linke ...

  3. java队列_如何彻底搞懂 Java 数据结构?CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  4. Java 数据结构与算法系列之冒泡排序

    一.前言 相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 Java 写的数据结构与算法. ...

  5. Java数据结构与算法——树(基本概念,很重要)

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 有网友私信我,期待我的下一篇数据结构.非常荣幸文章被认可,也非常感谢你们的监督. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督 ...

  6. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  7. 数据结构 python的书推荐-java数据结构书一般推荐看什么好?

    想要学习java的各种数据结构,一本良好的书籍会让你受益匪浅,本文就来推荐一些学习java数据结构适合看的书. 一.入门推荐 因为是入门,所以我们先不要求实现,阅读一些通过图片,打比方等通俗易懂的方法 ...

  8. Java数据结构与算法——插入排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,ja ...

  9. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

最新文章

  1. 【Qt】 error: LNK1107: 文件无效或损坏: 无法在 0x310 处读取
  2. Java 基础 之 关系运算符
  3. mysql的错误代码1064_mysql错误代码之1064的解决方案
  4. Android 开发实用小技巧
  5. Java通过class文件得到所在jar包
  6. anaconda下载的python在哪_Anaconda下Python环境下载及安装
  7. python科学计算与图形渲染_宁哥Python科学计算与图形渲染库课程
  8. 依赖注入底层反射原理_PHP基于反射机制实现自动依赖注入的方法详解_php技巧...
  9. 互联网下一个热点:服务业电子商务
  10. SQL Server里面如何导出包含数据的SQL脚本
  11. 多元梯度下降法演练(1)--特征缩放(特征归一化),Feature Scaling,mean normalization machine learning
  12. el 能否定义作用域变量_EL表达式语法简介及其使用
  13. MATLAB在线网页链接使用
  14. 魔兽世界暴雪隐藏密集
  15. Backstepping反步法控制四旋翼无人机(一)
  16. 3Dmax已经贴好图的文件如何导入unity3D中
  17. java窗体 个人信心_帮忙写下代码java swing,个人信息实例
  18. android widget动画,widget 动画 - androidCode的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. android源生进度条,如何使用源生css3实现圆环加载进度条
  20. Python 集合与集合运算

热门文章

  1. cad字体渐变_[AI10]透明渐变得问题 字体命令的一个变 pantone色系 AutoCAD2006中文版...
  2. 无向图的深度优先遍历非递归_LeetCode133-克隆图(附详细测试用例构建方法)
  3. iOS App 崩溃报告符号化,.ips崩溃报告文件分析
  4. 洛谷 P1463 [SDOI2005]反素数ant P1820 寻找AP数
  5. mysql分区管理 - hash分区
  6. 字符设备驱动笔记(二)
  7. C#多线程|匿名委托传参数|测试您的网站能承受的压力|附源代码
  8. linux下设置程序后台运行,linux中如何让进程在后台运行
  9. redis 备份导出rdb_Redis持久化知识点—RDB+AOF ,你了解多少
  10. js预览本地word文档_怎么免费下载百度文库付费文档?