Hi, 我是哈缺氧, 小顶堆的关键算法.
小顶堆核心算法, 比较简单, 共大家参考.
private static void makeMinSort(int[] arr, int i, int n) {
// 确定左孩子
int leftChild = i * 2 + 1;
// 确定右孩子
int rightChild = i * 2 + 2;
// 判断是否越界
if (leftChild > n || rightChild > n) {
return;
}
// 确定三个最小值
int min = i;
if (arr[leftChild] <= arr[rightChild] && arr[leftChild] < arr[i]) {
min = leftChild;
}
if (arr[leftChild] >= arr[rightChild] && arr[rightChild] < arr[i]) {
min = rightChild;
}
// i 最小表示有序
if (arr[i] < arr[leftChild] && arr[rightChild] > arr[i]) {
return;
}
// 经典交换 a b
/** 利用 a 交换 b c
* obj a = b
* b = c
* c = a
*/
int tem = arr[min];
arr[min] = arr[i];
arr[i] = tem;
// 递归解决问题
makeMinSort(arr, min, n);
}