最大堆的性质是除了根节点之外的所有节点(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. JPEG图像压缩算法流程详解

    JPEG图像压缩算法流程详解 JPEG代表Joint Photographic Experts Group(联合图像专家小组).此团队创立于1986年,1992年发布了JPEG的标准而在1994年获得 ...

  2. Hive如何加载和导入HBase的数据

    当我们用HBase 存储实时数据的时候, 如果要做一些数据分析方面的操作, 就比较困难了, 要写MapReduce Job. Hive 主要是用来做数据分析的数据仓库,支持标准SQL 查询, 做数据分 ...

  3. UVAlive4080_Warfare And Logistics

    给一个无向图,求出两个值,所有点到所有其他点的最短距离和,任意删除一条边后的这个值. 数据规模是100点1000边. 白书例题,不多说了直接对于每个点求出最短路树,对于每条边,如果它不是最短路树上的边 ...

  4. SPOJ_VLATTICE

    题目是给你一个空间,和一个点(n,n,n),求从原点出发能够直接接触多少个点(不经过任何一个点)? 典型的mobius反演即可. 首先,ans=3,因为(1,0,0),(0,1,0),(0,0,1)这 ...

  5. poj3061 Subsequence(尺取)

    Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...

  6. Python语言算法的时间复杂度和空间复杂度

    算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...

  7. Just Another Problem UVA - 11490(枚举)

    题意: 你有s个士兵,并打算把他们排成一个r行c列,但有两个"洞"的矩形方队,以迷惑敌人(从远处看,敌人可能误以为一共有r*c个士兵).洞是两个大小相同的正方形,为了隐蔽性更强,方 ...

  8. 单点登录(十一)-----遇到问题-----cas启用mongodb验证方式报错--Unable to locate Spring NamespaceHandler for XML schema na

    cas启用mongodb验证方式报错--Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.sp ...

  9. 解题:NOI 2009 管道取珠

    题面 考虑这个平方的实际意义,实际是说取两次取出一样的序列 那么设$dp[i][j][k][h]$表示第一次在上面取$i$个下面取$j$个,第二次在上面取$k$个下面取$h$个的方案数 等等$n^4$ ...

  10. 解题:CQOI 2017 老C的方块

    题面 看起来很像网络流的二分图套路题,然后我们大力观察(题目定义的相邻我用引号括起来,应该能看懂) 发现“相邻”的一对方格如果各自连着一个一个方格就gg了,于是对于所有这些“相邻”的方格,我们有两种选 ...