1. package lhz.algorithm.chapter.six;
  2. /**
  3. * “构建堆”,《算法导论》6.3章节 Building a heap
  4. * 利用之前实现的<code>MaxHeapify</code>算法,构建max-heap。
  5. * 伪代码:
  6. * BUILD-MAX-HEAP(A)
  7. * 1 heap-size[A] ← length[A]
  8. * 2 for i ← ⌊length[A]/2⌋ downto 1
  9. * 3 do MAX-HEAPIFY(A, i)
  10. * @author lihzh(苦逼coder)
  11. * 本文地址:http://mushiqianmeng.blog.51cto.com/3970029/737557
  12. */
  13. public class BuildMaxHeap {
  14. private static int[] input = new int[] { 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 };
  15. private static int heapSize = input.length;
  16. public static void main(String[] args) {
  17. buildMaxHeap();
  18. //打印数组
  19. printArray();
  20. }
  21. /**
  22. * 构造max-heap
  23. * 复杂度:《算法导论》原文分析如下:
  24. * Each call to MAX-HEAPIFY costs O(lg n) time, and there are O(n) such calls.
  25. * Thus,the running time is O(n lg n).
  26. */
  27. private static void buildMaxHeap() {
  28. //从树的深层逆序,构造max-heap,正好每次均可满足
  29. //MaxHeapify算法的前提,即所有子二叉树已经是max-heap
  30. for (int i = heapSize/2; i > 0; i--) {
  31. maxHeapify(input, i);
  32. }
  33. }
  34. /**
  35. * MaxHeap,调整算法,前提是假设所有的子二叉树已经是max-heap。
  36. * 复杂度:
  37. * 因为:T (n) ≤ T(2n/3) + Θ(1)
  38. * 所以有:T (n) = O(lgn)
  39. * @param array
  40. * @param index
  41. */
  42. private static void maxHeapify(int[] array, int index) {
  43. int l = index * 2;
  44. int r = l + 1;
  45. int largest;
  46. //如果左叶子节点索引小于堆大小,比较当前值和左叶子节点的值,取值大的索引值
  47. if (l <= heapSize && array[l-1] > array[index-1]) {
  48. largest = l;
  49. } else {
  50. largest = index;
  51. }
  52. //如果右叶子节点索引小于堆大小,比较右叶子节点和之前比较得出的较大值,取大的索引值
  53. if (r <= heapSize && array[r-1] > array[largest-1]) {
  54. largest = r;
  55. }
  56. //交换位置,并继续递归调用该方法调整位置。
  57. if (largest != index) {
  58. int temp = array[index-1];
  59. array[index-1] = array[largest-1];
  60. array[largest-1] = temp;
  61. maxHeapify(array,largest);
  62. }
  63. }
  64. private static void printArray() {
  65. for (int i : input) {
  66. System.out.print(i + " ");
  67. }
  68. }
  69. }

图示:

本文转自mushiqianmeng 51CTO博客,原文链接:http://blog.51cto.com/mushiqianmeng/737557,如需转载请自行联系原作者

算法导论Java实现-构建MaxHeap相关推荐

  1. 算法导论Java实现-随机化数组的两种方式(5.3章节)

    package lhz.algorithm.chapter.five; /** * 随机数组两种实现,<算法导论>第五章第三节 * 本文地址:http://mushiqianmeng.bl ...

  2. 算法导论06--红黑树构建算法

    一.目的 1.熟悉算法设计的基本思想 2.掌握构建红黑树的方法 二.内容与设计思想 编写随机整数生成算法,生成S到T范围内的N个随机整数并输出: 编写红黑树构建算法,中序遍历各节点,输出颜色和值: 随 ...

  3. 【算法导论33】跳跃表(Skip list)原理与java实现

    Skip list是一个用于有序元素序列快速搜索的数据结构,由美国计算机科学家William Pugh发明于1989年.它的效率和红黑树以及 AVL 树不相上下,但实现起来比较容易.作者William ...

  4. Java实现算法导论中Miller-Rabin随机性素数测试

    Miller-Rabin测试: 费马小定理:对于素数p和任意整数a,有ap ≡ a(mod p)(同余).反过来,满足ap ≡ a(mod p),p也几乎一定是素数. 伪素数:如果n是一个正整数,如果 ...

  5. Java实现算法导论中快速傅里叶变换FFT递归算法

    要结合算法导论理解,参考:http://blog.csdn.net/fjssharpsword/article/details/53281889 代码中算法思路:输入n位(2的幂)向量,分别求值FFT ...

  6. Java实现算法导论中线性规划单纯形算法

    需在理解算法导论中线性规划单纯性算法基础上理解Java实现的代码,结合http://blog.csdn.net/fjssharpsword/article/details/53195556理解. 具体 ...

  7. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  8. 算法导论——24.2 DAG最短路径算法java实现

    介绍 Bellman-Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题,但是对于DAG,可以有更加简化的算法去计算,使得时间复杂度更低. 针对DAG的特点,以拓扑排序为基础,提出了解 ...

  9. Java实现算法导论中Rabin-Karp字符串匹配算法

    Rabin-Karp算法的思想: 假设子串的长度为M,目标字符串的长度为N 计算子串的hash值 计算目标字符串中每个长度为M的子串的hash值(共需要计算N-M+1次) 比较hash值 如果hash ...

最新文章

  1. python实现数据库查询_通过Python实现mysql查询数据库实例
  2. python 字典的值是列表_python实现求和python如何通过列表中字典的值对列表进行排序...
  3. html二级选择题,2017计算机二级考试试题web习题及答案
  4. web前端技巧-文本如何垂直居中?多行文本如何实现上下居中?
  5. springboot工厂模式_最新整理138道阿里、快手等大厂面试题解析:基础+Spring+并发+JVM+设计模式+缓存...
  6. Python-----学了今天,忘了昨天.
  7. 程序人生:这5个程序员,改变了世界,你都认识吗!
  8. spring boot Redis集成—RedisTemplate
  9. 2s相机 android6,Android Camera2 使用总结
  10. struts2中配置文件的调用顺序
  11. 数据结构上机实践第四周项目5 - 猴子选大王
  12. android 按钮变形动画,android-动画切换按钮
  13. 【文献阅读笔记】(1):一篇手把手教你做GWAS的Guideline文献解读
  14. win7如何调整计算机c盘,Win7系统增加C盘空间的方法
  15. 小白学VUE——实现抖音时钟(CDN方式)
  16. Asp中显示%百分比函数FormatPercent的使用
  17. phpnow运行本地php文件,使用PHPnow搭建本地wordpress
  18. CubeMXIDE 汉化
  19. 2022-07-17 Linux group与user基础概念
  20. 算法工程师面试之集束算法(beam search)

热门文章

  1. 小波矩特征提取matlab代码
  2. 40无法u盘启动_制作好U盘启动盘,却无法引导启动,该怎么办?
  3. arduino nano 蓝牙_探索 Golang 云原生游戏服务器开发,5 分钟上手 Nano 游戏服务器框架...
  4. java swing 组件渲染过程_Java Swing无法正确渲染
  5. centos 编译 mysql_Centos编译mysql
  6. 扩展城市信道etu模型matlab仿真,LTE System Toolbox:无线通信系统的仿真、分析和测试...
  7. PHP中阶,PHP进阶
  8. python可视化窗口制作一个摇骰子游戏_使用python制作一个抽奖小游戏——骰子游戏...
  9. python自动化测试难不难_Python测试自动化好学还是Pythonweb开发好学?
  10. 使用pytest对django项目单元测试