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("把已知左右子樹為最大堆的堆調(diào)整為最大堆");
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("調(diào)整后:");
System.out.println(" " + a[0]);
System.out.println(" " + a[1] + " " + a[2]);
System.out.println(" " + a[3] + " " + a[4] + " "
+ a[5] + " " + a[6]);
}
本想著很簡單的算法結(jié)果一實(shí)現(xiàn)還出問題了,咦散劫,這不對呀~
遇到的問題如下:
1.報(bào)錯(cuò):java.lang.StackOverflowError 內(nèi)存溢出
百度之:可能是遞歸時(shí)是死循環(huán)稚机,也可能是JVM虛擬機(jī)內(nèi)存不夠。
看了一下代碼获搏,果然赖条,函數(shù)沒返回(¬_¬)
改之。
2.沒報(bào)錯(cuò),結(jié)果不對
檢查谋币,發(fā)現(xiàn)原來數(shù)組下標(biāo)從零開始啊仗扬,而書上的偽代碼直接從1開始,所以搞錯(cuò)了蕾额。
糾正早芭,OK
結(jié)果如下: