minHeapFixDown的递归和迭代形式
// 把以i为根节点的二叉堆调整成小顶堆
public static void minHeapFixDown(int[] arr, int i, int n) {
// 找到左右孩子
int left = 2 * i + 1;
int right = 2 * i + 1;
// 找到左右孩子中的最小孩子
// 左孩子越界,右孩子必越界,根节点为叶子节点,此为递归出口
if (left >= arr.length) {
return;
}
int min = left;
// 只有左孩子
if (left == arr.length - 1) {
} else {
if (arr[left] > arr[right]) {
min = right;
}
}
// 如果根节点比左右孩子都要小,不用调整
// 否则选取左右孩子中最小的节点,与根节点交换
// 对选取的孩子节点,以其为根节点对二叉堆进行递归调整
if (arr[i] <= arr[min]) {
return;
} else {
swap(arr, i, min);
i = min;// 移动根
minHeapFixDown(arr, i, n);
}
}
// 迭代形式的siftDown
public static void siftDown(int[] arr, int i, int n) {
int left = 2 * i + 1;
while (left < n) {
int right = left + 1;
int min = left;
if (right < n && arr[left] > arr[right]) {
min = right;
}
if (arr[i] <= arr[min]) {// 无需调整
break;
}
swap(arr, i, min);
i = min;
left = 2 * i + 1;
}
}