import java.util.Arrays;
/**
* @Author: subd
* @Date: 2019/8/15 8:35
*/
public class BinaryReactor {
/**
* 上浮调整
*
* @param array
*/
public static void upAdjust(int[] array) {
int childIndex = array.length - 1;
int parentIndex = (childIndex - 1) / 2;
//temp 保存插入的叶子节点值,用于最后的赋值
int temp = array[childIndex];
while (childIndex > 0 && temp < array[parentIndex]) {
//无需真正交换,单向赋值即可
array[childIndex] = array[parentIndex];
childIndex = parentIndex;
parentIndex = (parentIndex - 1) / 2;
}
array[childIndex] = temp;
}
/**
* 下浮调整
*
* @param array 待调整的堆
* @param parentIndex 要下沉的父节点
* @param length 堆的有效大小
*/
private static void downAdjust(int[] array, int parentIndex, int length) {
// temp保存节点值,用于最后的赋值
int temp = array[parentIndex];
int childIndex = 2 * parentIndex + 1;
while (childIndex < length) {
// 如果有右孩子,且右孩子小于左孩子的值,则定位到右孩子
if (childIndex + 1 < length && array[childIndex + 1] < array[childIndex]) {
childIndex++;
}
//如果父节点小于任何一个孩子的值,则直接跳出
if (temp <= array[childIndex])
break;
//无须真正交换,单向赋值即可
array[parentIndex] = array[childIndex];
parentIndex = childIndex;
childIndex = 2 * childIndex + 1;
}
array[parentIndex] = temp;
}
/**
* 构建堆
*
* @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,3,2,6,5,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};
upAdjust(array);
System.out.println(Arrays.toString(array));
}
}
二叉堆
最新推荐文章于 2022-04-29 20:52:17 发布
本文深入探讨了Java中堆的上浮和下浮调整算法,通过具体的代码实现,详细解释了如何在二叉堆中进行元素的正确排序,以维持堆的特性。文章通过实例演示了算法的工作流程,为理解数据结构和算法提供了实用的参考。
559

被折叠的 条评论
为什么被折叠?



