将数组表示为堆

时间:2016-03-16 23:58:48

标签: java heap min-heap

我试图以Minimum-Heap的形式表示一个数组。我在其中一个叶子节点面临一个问题,其中父节点大于(12个大于6)正确的子节点。我不明白我的编码有什么问题,请帮忙。

这是我的代码:

public class MinHeap {

public void heapify(int Array[], int i){

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

    int length=Array.length;

    if(left<length &&  Array[left]< Array[i] && Array[left]< Array[right])
        min=left;
    else if(right<length && Array[right]<Array[i] && Array[right]<Array[left])
        min=right;
    else min=i;

    if(min!=i){
        int temp=Array[i];
        Array[i] = Array[min];
        Array[min]=temp;
        heapify(Array,min);
    }
}

public void display(int Array[]){
    for(int i=0; i<Array.length; i++)
        System.out.print(Array[i]+" ");
}

public static void main(String[] args){
    int Array[]={2,1,4,5,6,100,0,9,8,3,12,32,6,7,1000,999,20};
    //int Array[]={1, 8, 9, 2, 10, 14, 3, 4, 7, 16};
    int length=Array.length;

    MinHeap object= new MinHeap();
    System.out.println(length);

    object.display(Array);
    System.out.println();

    for(int i=(length/2)-1;i>=0;i--){
        object.heapify(Array,i);

    }

    System.out.println();
    object.display(Array);
}

}

我得到的输出是:

0 1 3 2 4 12 5 9 8 6 100 32 6 7 1000 999 20 

2 个答案:

答案 0 :(得分:0)

试试这个。

static void heap(int[] a) {
    for (int i = 0; i < a.length; ++i) {
        while (true) {
            int p = (i - 1) / 2;
            if (a[p] <= a[i])
                break;
            int t = a[i];
            a[i] = a[p];
            a[p] = t;
            i = p;
        }
    }
}

int a[]={2,1,4,5,6,100,0,9,8,3,12,32,6,7,1000,999,20};
heap(a);
System.out.println(Arrays.toString(a));
// -> [0, 2, 1, 5, 3, 6, 4, 9, 8, 6, 12, 100, 32, 7, 1000, 999, 20]

答案 1 :(得分:0)

您的孩子索引计算错误。你应该使用:

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

输出将是:

  

0 1 2 5 3 6 4 9 8 6 12 32 100 7 1000 999 20