1128XF

二叉堆的增加/移除元素

 public static void main(String[] args) {
int[] arr = new int[]{1, 3, 2, 6, 5, 7, 8, 9, 10, 0};
upAdjust(arr, ConfigService::minHeap);
System.out.println(Arrays.toString(arr));
}

public static void heapSort(int[] array) {
//1.把无序数组构建成最大堆
//从最后一个非叶子节点开始做"下沉"调整
for (int i = (array.length - 1 - 1) / 2; i >= 0; i--) {
downAdjust(array, i, array.length);
}
// 2.循环删除堆顶元素,移到集合尾部,调整堆产生新的堆顶
for (int i = array.length - 1; i > 0; i--) {
// 最后1个元素和第1个元素进行交换
int temp = array[i];
array[i] = array[0];
array[0] = temp;
//“下沉”调整最大堆
downAdjust(array, 0, i);
}
}

public 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;
System.out.println(Arrays.toString(array));
}

public static void upAdjust(int[] array, Predicate<Pair<Integer, Integer>> predicate) {
int childIndex = array.length - 1;
int parentIndex = (childIndex - 1) / 2;
// temp保存插入的叶子节点值,用于最后的赋值
int temp = array[childIndex];
int parent = array[parentIndex];
while (childIndex > 0 && predicate.test(Pair.of(temp, parent))) {
array[childIndex] = parent;
childIndex = parentIndex;
parentIndex = (parentIndex - 1) / 2;
parent = array[parentIndex];
}
array[childIndex] = temp;
}

public static boolean maxHeap(Pair<Integer, Integer> pair) {
return pair.getLeft() > pair.getRight();
}

public static boolean minHeap(Pair<Integer, Integer> pair) {
return pair.getLeft() < pair.getRight();
}

posted on 2024-01-26 13:42  1128XF  阅读(5)  评论(0编辑  收藏  举报

导航