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;
}
}
堆排序代码及简要说明(构建大根堆代码+大根堆的维护代码)
最新推荐文章于 2023-07-18 19:50:15 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)