堆排序代码及简要说明(构建大根堆代码+大根堆的维护代码)

该博客详细介绍了如何使用Java实现最大堆及其调整方法。通过一个具体的例子展示了最大堆的构建过程,并应用最大堆实现了一个高效的排序算法。文章涵盖了从数组初始化到堆排序的完整流程,包括关键的adjust和sort方法的实现细节。
摘要由CSDN通过智能技术生成

import java.util.Arrays;
public class Heap {
public static void main(String[] args) {
	int[] arr= {5,4,9,1,7,3,6,8,2};
    //将adjust方法放到for循环中,为了使p按照顺序执行,如果直接写了函数,p会改变
	for(int p=arr.length-1;p>=0;p--) {
     //将数组,parent值和数组长度传入,因为数组为引用传递,调用方法后,里面的值会改变,而parent为值传递,不会改变
		adjust(arr,p,arr.length);
	}
    //将数据一一挑选出来,不再参与堆得创建
	sort(arr);
	System.out.println(Arrays.toString(arr));
}

public static void sort(int arr[]) {
    //每次运行 都会挑出一个数,所以可以当做数组长度-1
	for(int i=arr.length-1;i>0;i--) {
        //堆顶和堆尾进行交换
		int temp=arr[0];
		arr[0]=arr[i];
		arr[i]=temp;
        //传入数组,parent位置,可以一只当做堆顶0,传入数组长度
		adjust(arr,0,i);
	}	
}


public static void adjust(int arr[],int parent,int length) {
    //将父节点的值赋给temp
	int temp=arr[parent];
    //左孩子等于父节点*2+1
	int lchild=2*parent+1;
    //当左孩子小于数组长度,一直执行
	while(lchild<length) {
		int rchild=lchild+1;
        //如果右孩子比左孩子大并且小于数组长度,让左孩子+1
		if(rchild<length&&arr[rchild]>arr[lchild]) {
			lchild++;
		}
        //如果父节点的值大于左孩子,直接结束,开始下一轮
		if(temp>arr[lchild]) {
			break;
		}
        //一直让父节点的值为最大
		arr[parent]=arr[lchild];
		parent=lchild;
		lchild=lchild*2+1;
	}
    //此时父节点已经变为孩子节点,把原来存储的值交给现在的父节点。
	arr[parent]=temp;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值