我试图以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
答案 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