您的位置:首页 > 其它

[刷题]Heapify

2015-08-31 15:12 162 查看
[LintCode]Heapify

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: