二叉堆的代码实现
import java.util.Arrays;
/**
* @author lizz
* @ClassName BinaryReactor.java
* @Description 二叉堆
* @createTime 2022年04月20日 15:02:00
*/
public class BinaryReactor {
/**
* "上浮"调整
* @param array 待调整的堆
*/
public static void upAdjust(int[] array){
int childIndex = array.length-1;
int parentindex = (childIndex-1)/2;
//用tmp保存插入的叶子节点值,用于最后的赋值
int tmp = array[parentindex];
while(childIndex >0 && tmp < array[parentindex]){
// 无需真正交换,简单赋值即可
array[childIndex] = array[parentindex];
childIndex = parentindex;
parentindex = (parentindex-1)/2;
}
array[childIndex] = tmp;
}
/**
* "下沉"调整
* @param array array 待调整的堆
* @param parentIndex 要”下沉“的父节点
* @param length 堆的有效大小
*/
public static void downAdjust(int[] array, int parentIndex, int length){
//用tmp保存父节点值,用于最后的赋值
int tmp = array[parentIndex];
int leftChildIndex = 2*parentIndex+1;
while(leftChildIndex < length ){
//如果有右孩子,且右孩子小于左孩子的值,则定位到右孩子
if(leftChildIndex+1 < length && array[leftChildIndex+1] < array[leftChildIndex]){
leftChildIndex ++ ;
}
//如果父节点小于任何一个子节点 直接跳出
if(array[parentIndex] < array[leftChildIndex]){
break;
}
// 无需真正交换,简单赋值即可
array[parentIndex] = array[leftChildIndex];
parentIndex = leftChildIndex;
leftChildIndex = 2*leftChildIndex+1;
}
array[parentIndex] = tmp;
}
/**
* 构建堆
* @param array 待调整的堆
*/
public static void buildHeap(int[] array){
// 从最后一个非叶子节点开始,依次做“下沉”调整
for (int i = (array.length-2)/2; i >= 0 ; i--) {
downAdjust(array,i,array.length);
}
}
public static void main(String[] args) {
int[] array = new int[]{1,2,3,4,5,6,7,8,9,10,0};
upAdjust(array);
System.out.println(Arrays.toString(array));
array = new int[]{7,1,3,10,5,2,8,9,6};
buildHeap(array);
System.out.println(Arrays.toString(array));
}
}