最大堆的性质是除了根节点之外的所有节点(i)都需要满足A[PARENT(i)]>A[i],即其对应节点值小于其父节点对应值。

下面实现以数组int []a构建最大堆。

public class Heap {
public static int Left(int i)//返回左子结点
{return 2*i+1;}

public static int Right(int i)//返回右子节点
{return 2*i+2;}

public static void Max_Heapify(int []a,int i)//以数组a 和i为参数   i为数组内坐标
{
int left=Heap.Left(i);
int right=Heap.Right(i);
int most;//记录最大值的数组下标
int heapSize=a.length;
if((left<heapSize)&&(a[left]>a[i]))//判断left<heapSize 是为了判断left是否溢出数组
most=left;
else
most=i;
if((right<heapSize)&&(a[right]>a[most]))//!注意不是>a[i]  此处为了判断出 a[i]a[left]a[right]最大值
most=right;

if(most!=i)
{
Heap.swap(a, i, most);//交换 a[i]和a[most]
Max_Heapify(a,most);//交换完之后 递归调用  确保交换后的a[most]满足 A[PARENT(i)]>A[i]
}

}
public static void swap(int []a,int i,int j)//交换函数
{

int swap=a[i];
a[i]=a[j];
a[j]=swap;
}

public static void build_Max_Heap(int []a)//以数组int[]a为参数调用
{
for(int i=a.length/2;i>=0;i--)//从i=a.length/2开始调用Max_heapify()函数,因为 i>a.length/2的节点没有子节点。
{
Heap.Max_Heapify(a, i);
}

}

public static void main(String[] args) {
int []a={1,2,3,4,5,6,7};
Heap.build_Max_Heap(a);
for(int p:a)
System.out.println(p);//输出函数
}

}

输出:

7
5
6
4
2
1
3

总结:int []a={1,2,3,4,5,6,7}

初始时可以看为

  1. 开始从i=(a.length/2)=7/2=3开始,a[3]=4,无子节点 i--;
  2. i此时为2,a[2]=3.    left[i]= 6,right[i]=7,a[most]=7,交换 3,7 得,之后还要对3递归判断 Max_Heapify(a,most);发现3符合其所在位置,i--.
  3. 此时i=1,a[1]=2,left[i]=4,right[i]=5,a[most]=5,交换2 ,5得之后还要对2递归判断 Max_Heapify(a,most);发现2符合其所在位置,i--.
  4. i=0;a[0]=1,left[i]=5,right[i]=7,a[most]=7,交换1,7得,之后还要对1递归判断 Max_Heapify(a,most);发现1 6 3 中6最大 所以 1 6 交换位置得

所以int[]a现在为{7,5,6,4,2,1,3},与输出相同。

如果该文章有任何错误,欢迎大家指正,谢谢。

java 创建最大堆的更多相关文章

  1. java创建文件和目录

    java创建文件和目录 2013-09-04 12:56 99933人阅读 评论(7) 收藏 举报  分类: JAVA基础(10)  版权声明:本文为博主原创文章,未经博主允许不得转载. 创建文件和目 ...

  2. JAX-WS(一)之使用wsgen从Java创建简单的WebService

    概念 JAX-WS2.0的全称Java API for XML-Based Web Service 2.0.JAX-WS2.0是对JAX-RPC1.0规范的扩展,是JAX-RPC1.1的后续版本,JA ...

  3. 【Java】Java创建String时,什么情况放进String Pool?

    对Java创建String是否放入String pool作代码性的试验. 参考的优秀文章 JAVA面试题解惑系列(二)——到底创建了几个String对象? public String(String o ...

  4. java创建多线程(转载)

    转载自:Java创建线程的两个方法 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对 ...

  5. Oracle - java创建Oracle 的触发器

    Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...

  6. Java创建柱状图及饼状图

    Java创建图表其实还是很方便的,但是要引入相关的jar包.如下 jfreechart.jar jcommon,jar gnujaxp.jar 其中最主要的是jfreechart.jar. 下面就让我 ...

  7. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  8. 操作系统实现线程的几种模式 和 java创建线程的3个方式

    操作系统实现线程的几种模式 和 java创建线程的3个方式  这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...

  9. Java 创建文本内容

    Java 创建文本内容 import java.io.FileWriter; import java.io.IOException; public class TestFile { public st ...

随机推荐

  1. HDU 1231 最大子序列

    http://acm.hdu.edu.cn/showproblem.php?pid=1231 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连 ...

  2. HDU 2106 母猪的故事

    http://acm.hdu.edu.cn/showproblem.php?pid=2160 Problem Description 话说现在猪肉价格这么贵,著名的ACBoy 0068 也开始了养猪生 ...

  3. vue开发完成后打包后图片路径不对

    用vue做了一个小的移动端项目,从头到尾做下来,感觉自己好多东西都没弄清楚过.也学到了很多,已整理笔记在自己电脑上,但是比较零散,空了再来仔细整理整理. 于是,上周五模拟好数据(接口还未写),准备打包 ...

  4. VNC Server (Ubuntu 16.04.3 GNOME)

    1. 安装VNC服务 sudo apt-get install vnc4server -y 2. 启动VNC服务 vncserver :1 3. 此时客户端连上后你会发现灰屏,原因出在~/.vnc/x ...

  5. 【问底】徐汉彬:PHP7和HHVM的性能之争 (真是学到了很多)

    来源:http://www.csdn.net/article/2014-12-25/2823234 作者:徐汉彬 摘要:近日,PHP7和HHVM的性能之争成为了一个讨论热点,但毫无疑问,它们都在提升P ...

  6. app流畅度测试--使用手机自带功能

    1.进入开发者选项,在“监控”选项卡找到“GPU呈现模式分析”的选项 2.开启后,即可以条形图和线形图的方式显示系统的界面相应速度 3.那么要如何根据曲线判断系统是否流畅呢?实际上这个曲线表达的是GP ...

  7. C++模式学习------代理模式

    Proxy代理模式 : 为其他对象提供一种代理以控制对这个对象的访问.代理类作为桥梁是请求方和执行方的中间者,将请求方和真正的执行方分割开来,也是两者之间调用的协调者.例如执行类也就是被代理类,可以在 ...

  8. Stone Game, Why are you always there? HDU - 2999(sg定理)

    题意:给你n个数的集合,表示你每次取石子只能为集合里的数,然后给你一排石子,编号为1~n,每次你可以取相邻位置的连续石子(数量只能为集合里的数),注意石子的位置时不变的,比如把2拿走了,1和3还是不相 ...

  9. R1 学习记录

    libevent框架学习特点: 1.可移植行,跨平台的 2.速度快,libevent会用各平台最快的非阻塞IO函数 3.扩展性 4.方便性构成: 1.evutil: 抽象出各平台network的函数 ...

  10. 【BZOJ1150】数据备份(动态规划,凸优化)

    [BZOJ1150]数据备份(动态规划,凸优化) 题面 BZOJ 洛谷 题解 在不考虑\(K\)的情况下很容易\(dp\) 如果把\(K\)考虑进状态显然是\(O(n^2)\)级别. 所以凸优化一下即 ...