public class Solution {
/**
* @param A: Given an integer array
* @return: void
*/
public void heapify(int[] A) {
// 从树的最后一个点开始,一层一层地向上遍历
for (int i = A.length - 1; i >= 0; i--) {
siftdown(A, i);
}
}
/**
* 确保k表示的位置的值,在以它为根的子树中最小
*/
private void siftdown(int[] A, int k) {
if (k >= A.length) {
return;
}
// 三个点中最小点的序号
int minIndex = k;
// 和左子比
if (k * 2 + 1 < A.length && A[k * 2 + 1] < A[minIndex]) {
minIndex = k * 2 + 1;
}
// 和右子比
if (k * 2 + 2 < A.length && A[k * 2 + 2] < A[minIndex]) {
minIndex = k * 2 + 2;
}
// 既比左子小又比右子小,则退出
if (minIndex == k) {
return;
}
// 交换数组中的两个数
int temp = A[minIndex];
A[minIndex] = A[k];
A[k] = temp;
// 别忘了:继续追踪这个大数
siftdown(A, minIndex);
return;
}
}
[刷题]Heapify
最新推荐文章于 2021-02-18 10:04:58 发布