Я пытаюсь создать максимальную кучу, и когда каждое новое значение вставляется, значение сдвигается вверх или вниз в правильное положение, мне еще предстоит реализовать функцию сдвига вниз, так что на данный момент я использую тест это должно только потребовать, чтобы программа сдвинулась вверх. Данные теста вводятся в следующем порядке:
[16, 10, 14, 9, 7, 1, 4, 2, 8, 3]
Я использую следующий код в главном классе для вставки значений в кучу:
package com.company;
public class Main {
public static void main(String[] args) {
BinaryHeap bh = new BinaryHeap();
bh.insert(16);
bh.insert(10);
bh.insert(14);
bh.insert(9);
bh.insert(7);
bh.insert(1);
bh.insert(4);
bh.insert(2);
bh.insert(8);
bh.insert(3);
bh.printHeap();
}
}
И этот следующий бит кода, где происходит вставка и сдвиг:
package com.company;
public class BinaryHeap {
private int[] Heap;
private int size;
private int maxsize;
public BinaryHeap(){
this.maxsize = 10;
this.size = 0;
Heap = new int[this.maxsize + 1];
}
public int Parent(int i){
return (i)/2;
}
public int LeftChild(int i){
return (2*i);
}
public int RightChild(int i){
return ((2*1)+1);
}
public void insert(int value) {
if(size <= Heap.length) {
size++;
Heap[size] = value;
siftUp(size);
}
}
private void siftUp(int i) {
int parentIndex;
int tmp;
if (i != 0) {
parentIndex = Parent(i);
if (Heap[parentIndex] < Heap[i]) {
tmp = Heap[parentIndex];
Heap[parentIndex] = Heap[i];
Heap[i] = tmp;
siftUp(parentIndex);
}
}
}
public void printHeap()
{
for (int i = 1; i < maxsize; i++) {
System.out.print(" PARENT : " + Heap[Parent(i)]
+ " LEFT CHILD : " + Heap[LeftChild(i)]
+ " RIGHT CHILD :" + Heap[RightChild(i)]);
System.out.println();
}
}
}
Функция сдвига siftUp (), который я считаю проблемой. Когда программа запускается со следующими выходными данными:
PARENT : 16 LEFT CHILD : 9 RIGHT CHILD :10
PARENT : 14 LEFT CHILD : 8 RIGHT CHILD :10
PARENT : 14 LEFT CHILD : 1 RIGHT CHILD :10
PARENT : 9 LEFT CHILD : 0 RIGHT CHILD :10
PARENT : 9 LEFT CHILD : 3 RIGHT CHILD :10
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 12 out of bounds for length 11
at com.company.BinaryHeap.printHeap(BinaryHeap.java:61)
at com.company.Main.main(Main.java:20)
Но это не правильно, потому что 1) исключение индекса вне границ в конце, которое приходит из функции printHeap () и 2) дочерние элементы каждого родительского узла не в нужном месте, потому что узел root должен быть 16 с 14 и 10 как дочерние, также, когда он печатает значения для кучи, он печатает 0, однако 0 никогда не вставляется в куча. Я попытался выполнить некоторые из моих собственных отладок, но без особого успеха, поэтому любая помощь в этом приветствуется.