代码:
import java.util.Arrays;
class Heapify {
int[] array;
Heapify (int[] array){
this.array = array;
}
public void heap (int[] aArray){
int left = 0;
int right = aArray.length - 1;
int n = aArray.length;
int numOfSwap = 0;
heapify1(aArray, left, right, numOfSwap );
}
public void heapify1 (int[] aArray, int left, int right, int numOfSwap) {
//from last one that have a child
for (int i = (right - 1)/2; i > left - 1; --i){
System.out.println("in heapify for loop with i = " + i + " number of swap: " + numOfSwap);
if (aArray[2*i + 2] > aArray[i]) {//if right child is bigger than parent
System.out.println("in heapify for loop and if #1: " + numOfSwap);
swap(aArray, i, 2*i + 2, right, numOfSwap);
}
else if (aArray[2*i + 1] > aArray[i]){
System.out.println("in heapify for loop and else if #2: " + numOfSwap);
swap(aArray, i, 2*i + 1, right, numOfSwap);
}
}
}
public int swap (int[] aArray, int parent, int child, int right, int numOfSwap ){
System.out.println("in swap before: " + numOfSwap );
int temp = aArray[parent];
aArray[parent] = aArray[child];
aArray[child] = temp;
numOfSwap = numOfSwap + 1;
System.out.println("inswap after: " + numOfSwap );
heapify1 (aArray, parent, right, numOfSwap );
return numOfSwap;
}
public static void main(String args[]) {
int[] array1 = new int[] {21,15,25,3,5,12,7,45,19,2,9};
Heapify hs = new Heapify(array1);
hs.heap(array1);
}
}
结果打印值为:
in heapify: 0
in heapify for loop with i = 4 number of swap: 0
in heapify for loop and if #1: 0
in swap before: 0
inswap after: 1
in heapify: 1
in heapify for loop with i = 4 number of swap: 1
in heapify for loop with i = 3 number of swap: 0
in heapify for loop and if #1: 0
in swap before: 0
inswap after: 1
in heapify: 1
in heapify for loop with i = 4 number of swap: 1
in heapify for loop with i = 3 number of swap: 1
in heapify for loop and else if #2: 1
in swap before: 1
inswap after: 2
in heapify: 2
in heapify for loop with i = 4 number of swap: 2
in heapify for loop with i = 3 number of swap: 2
in heapify for loop with i = 2 number of swap: 0
in heapify for loop with i = 1 number of swap: 0
in heapify for loop and else if #2: 0
我不明白为什么swap
传递numOfSwap = 1
给heapify1
,但是在 for 循环中,第二次迭代numOfSwap
被值 0 覆盖。另外,为什么在后一种情况下,这种被覆盖的行为发生在第三次迭代?
我知道这可能是“引用传递”或“值传递”的问题,但真正让我困惑的一件事是 numOfSwap 在交换中从 0 更新为 1,交换再次调用 heapify1成功地将 numOfSwap = 1 传递给 heapify1。但是为什么 numOfSwap 在迭代后在 for 循环中被初始化?
有两种不同类型的heapify1
方法上下文。
一个是打电话时heapify1(aArray, left, right, numOfSwap );
的heap
方法。在这个上下文中,numOfSwap
是 0,并保持 0。并且正是在这个上下文中,for
执行循环。它可能看起来像“numOfSwap 在迭代后在 for 循环中被初始化?”,但事实并非如此。该值永远不会被修改并保持为 0。
另一个方面是打电话时heapify1 (aArray, parent, right, numOfSwap );
的swap
方法,所以说“交换电话heapify1再次通过numOfSwap = 1〜heapify1成功”。但是这些传递的值只在这个上下文中使用,与前面提到的第一个上下文无关,也不会修改值为numOfSwap
0的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句