无法使MaxHeapify正常工作

时间:2014-09-18 23:56:42

标签: java heap

好吧,我花了8个多小时才完成这项工作。我已经逐字复制了本书中的示例,并尝试在线基于其他资源实现堆。我仍然无法使堆正常工作。这是我到目前为止编码的内容:

import static java.lang.System.*;
import java.util.Random;
import java.util.Scanner;

public class Heap{

static int[] arr;
static int heapSize;
static int max = 0;

public static void main(String[] args) {

    Scanner keys = new Scanner(in);

    out.print("Enter size of heap desired: ");                      //Receive input from user regarding
    int arrSize = keys.nextInt();                                   //desired heap size

    ArrayBuild(arrSize);            //Call builder to construct array based on user desired size

    heapSize = arr.length;

    int start = arr.length/2-1;

    MaxHeapify(start);

    keys.close();

}

public static void ArrayBuild(int size){           //Constructs new array based on given size
    arr = new int[size];

    for(int i=0; i<arr.length; i++)
        arr[i] = new Random().nextInt(10)+1;
}

public static void MaxHeapify(int i){

        int left = 2*i;
        int right = 2*i+1;

        if(left <= heapSize && arr[left] > arr[i]){
            max = left;
        }else{
            max = i;
        }

        if(right <= heapSize && arr[right] > arr[max]){
            max = right;
        }

        if(max != i){
            swap(i, max);
            MaxHeapify(max);
        }
}

public static void BuildMaxHeap(){
    for(int i=(arr.length/2); i>0; i--)
        MaxHeapify(i);
}

public static void swap(int i, int max){
    int temp = arr[i];
    arr[i] = arr[max];
    arr[max] = temp;
}   

}

1 个答案:

答案 0 :(得分:0)

2个问题:

int left = 2 * i;
int right = 2 * i + 1;

应该是:

int left = 2 * i + 1;
int right = 2 * i + 2;

Java数组基于0,因此对于根(这是第一个元素),您的公式适用于使用基于1的数组的情况。在Java中,左边的孩子也是0,因为我记得的是2 * 0 = 0等。

第二,当您在main()中构建堆时,您需要为MaxHeapify()中的一半元素运行BuildMaxHeap(),而不仅仅是中间元素,例如这样:

for(int start = arr.length / 2 - 1; start >= 0; start--) {
    MaxHeapify(start);
}

同样在BuildMaxHeap()中,您应该将停止条件更改为>=并从arr.length / 2 - 1开始。

希望这有帮助。