这里的堆就是我们所熟悉的二叉树
而小顶堆又是什么呢? 小顶堆就是根节点比子节点小,子节点比叶子节点小。所以我们第一步是进行堆化,从它倒数第一个子节点进行堆化(从右到左)
它检查完了之后它的兄弟节点再检查
在进行交换子节点始终比叶子节点小
当下沉完成之后,同理在检查它的兄弟节点
当检查完之后再返回它的子节点,子节点进行下沉
对调完成之后,不在考虑它对调的那个位置了
在进行向下调整
然后根节点再和最后那个位置交换了(注意不考虑之前交换的位置)
在继续下沉,和最后可以考虑的位置进行交换
最后就交换下沉就如下图所示
在输出就可以了
import java.util.Scanner;
public class _堆排序小顶堆 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
// int n=sc.nextInt();
int A[] = {1,2,9,7,6,3,4,2};
sort(A);
for (int i = 0; i =0; i--) {
MinHeapFixDown(A,i,n);
}
}
private static void MinHeapFixDown(int[] A,int i,int n) {
//找到左右孩子
int left = i*2+1;
int right= i*2+2;
//如果左孩子已经越界,i就是叶子节点
if(left>=n)return;
int min=left;
if(right<n){
if(A[right]<A[left]) {
min=right;
}
}
//min指向了left和right中的最小的那个
//如果A[i]比两个孩子小不用调整
if(A[i]=0 ; x--) {
int temp=A[0];
A[0]=A[x];
A[x]=temp;
//缩小堆的范围,对堆顶进行向下调整
MinHeapFixDown(A,0,x);
}
}
}