码迷,mamicode.com
首页 > 编程语言 > 详细

java 创建最大堆

时间:2015-05-16 23:05:46      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

最大堆的性质是除了根节点之外的所有节点(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 创建最大堆

标签:

原文地址:http://www.cnblogs.com/xiaodeyao/p/4508759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!