好吧,我花了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;
}
}
答案 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
开始。
希望这有帮助。