最大堆java构建_java 创建最大堆

最大堆的性质是除了根节点之外的所有节点(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((lefta[i]))//判断left

most=left;

else

most=i;

if((righta[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}

初始时可以看为

72a206a16c2f5f166626cc3022de1602.png开始从i=(a.length/2)=7/2=3开始,a[3]=4,无子节点 i--;

72a206a16c2f5f166626cc3022de1602.png

i此时为2,a[2]=3.    left[i]= 6,right[i]=7,a[most]=7,交换 3,7 得

fff70e3498d3e66f2098fc67a9663ecb.png,之后还要对3递归判断 Max_Heapify(a,most);发现3符合其所在位置,i--.

此时i=1,a[1]=2,left[i]=4,right[i]=5,a[most]=5,交换2 ,5得

d13a0c4dde50df561467ef38b479ecef.png之后还要对2递归判断 Max_Heapify(a,most);发现2符合其所在位置,i--.

i=0;a[0]=1,left[i]=5,right[i]=7,a[most]=7,交换1,7得

c1502a1086ccaa7fd2214a9ddf63273c.png,之后还要对1递归判断 Max_Heapify(a,most);发现1 6 3 中6最大 所以 1 6 交换位置得

cce18199f447636aec8857256a58f78e.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值