我正在尝试使用以下代码在java中创建一个Max-Heap:
public class Heapify {
// 16 14 10 8 7 9 3 2 4 1
public static int[] Arr = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
public static int counter = 0;
public static void main(String[] args) {
int kk;
for (kk = 0; kk <= Arr.length - 1; kk++) {
heapM(Arr, kk);
}
for (int krk = 0; krk < Arr.length; krk++) {
System.out.println(Arr[krk]);
}
}
public static void heapM(int[] Arr, int i) {
int largest;
int left = i * 2;
int right = i * 2 + 1;
if (((left < Arr.length) && (Arr[left] > Arr[i]))) {
largest = left;
} else {
largest = i;
}
if (((right < Arr.length) && (Arr[right] > Arr[largest]))) {
largest = right;
}
if (largest != i) {
swap(i, largest);
heapM(Arr, largest);
}
}
private static void swap(int i, int largest) {
int t = Arr[i];
Arr[i] = Arr[largest];
Arr[largest] = t;
}
}所需的输出应为:
16 14 10 8 7 9 3 2 4 1而我得到的是
4 3 16 14 8 9 10 2 1 7有没有人能帮我解释一下为什么堆没有正确构建?
谢谢
发布于 2012-07-18 02:43:07
我运行了你的代码,除了Jodaka所说的,我还发现了一个错误
for (kk = 0; kk <= Arr.length - 1; kk++) {
heapM(Arr, kk);
}应该是
for (kk = Arr.length -1; kk >= 0; kk--) {
heapM(Arr, kk);
}因为在做MaxHepify的时候,你会从头开始,然后向后走。和
int left = i * 2;
int right = i * 2 + 1;应该是,正如Jodaka所说
int left = 2*i+1;
int right = 2*i + 2;我在这里运行了它,现在输出是正确的
发布于 2012-07-18 02:35:48
我想你的问题出在这里:
int left = i * 2;
int right = i * 2 + 1;因为java数组是从零开始的,所以您是说0的左子元素是0*2= 0!修正你的逻辑,看看这是否能解决你的问题。
发布于 2013-03-30 05:12:44
for (kk = Arr.length -1; kk >= 0; kk--) {
heapM(Arr, kk);
}应该是
for (kk = (Arr.length -1)/2; kk >= 0; kk--) {
heapM(Arr, kk);
}效率更高。
编辑这使您可以在O(n)时间内构建一个堆,而不是O(n*lg(n))时间,其解释如下:http://en.wikipedia.org/wiki/Binary_heap#Building%5Fa%5Fheap
https://stackoverflow.com/questions/11528591
复制相似问题