static void MaxHeapify(int a[], int i) {
int left = i * 2 + 1;
int right = (i * 2) + 2;
if(left > a.length || right > a.length)
return;
int max;
int tmp;
if (a[left] > a[i])
max = left;
else
max = i;
if(a[right] > a[max])
max = right;
if(max != i)
{
tmp = a[max];
a[max] = a[i];
a[i] = tmp;
MaxHeapify(a , max);
}
}
public static void main(String[] args) {
System.out.println("===============================");
System.out.println("把已知左右子树为最大堆的堆调整为最大堆");
System.out.println("以下为输入的堆:");
int a[] = { 5, 10, 20, 6, 8, 11, 12 };
System.out.println(" " + a[0]);
System.out.println(" " + a[1] + " " + a[2]);
System.out.println(" " + a[3] + " " + a[4] + " "
+ a[5] + " " + a[6]);
MaxHeapify(a, 0);
System.out.println("===============================");
System.out.println("调整后:");
System.out.println(" " + a[0]);
System.out.println(" " + a[1] + " " + a[2]);
System.out.println(" " + a[3] + " " + a[4] + " "
+ a[5] + " " + a[6]);
}
本想着很简单的算法结果一实现还出问题了,咦,这不对呀~
遇到的问题如下:
1.报错:java.lang.StackOverflowError 内存溢出
百度之:可能是递归时是死循环,也可能是JVM虚拟机内存不够。
看了一下代码,果然,函数没返回(¬_¬)
改之。
2.没报错,结果不对
检查,发现原来数组下标从零开始啊,而书上的伪代码直接从1开始,所以搞错了。
纠正,OK
结果如下: