Я пытаюсь реализовать метод insert()
для реализации кучи на основе массивов, но всякий раз, когда я тестирую метод, вставляя более одного целого числа, где по крайней мере одно из них больше, чем ~ 4, программа занимает навсегда запустить. Например, заявка heap.insert(1)
и heap.insert(8)
вместе в основной функции будет выполняться навсегда. Вот моя куча класс:Java Arraylist Куча реализации
import java.util.*;
public class Heap<E extends Comparable<E>> implements HeapAPI<E>
{
/**
* A complete tree stored in an array list representing this
* binary heap
*/
private ArrayList<E> tree;
/**
* Constructs an empty heap
*/
public Heap()
{
tree = new ArrayList<E>();
}
public boolean isEmpty()
{
return tree.isEmpty();
}
public void insert(E obj)
{
tree.add(tree.size(), obj);
siftUp(tree.size() - 1);
}
/**
* siftUp from position k. The key or node value at position
* may be greater that that of its parent at k/2.
* @param k position in the heap arraylist
*/
private void siftUp(int k)
{
E v = tree.get(k);
while (v.compareTo(tree.get(k/2)) == 1)
{
tree.add(k, tree.get(k/2));
k = k/2;
}
tree.add(k, v);
}
public int size()
{
return tree.size();
}
}
Это псевдокод дал нам мой профессор, что я моделировал insert()
и siftUp()
методы из:
Программа работает для небольших чисел, например, если Я набираю heap.insert(1)
кучу раз подряд, но никогда не заканчивает работу, если я меняю одно из чисел на большее целое число. Ошибок не возникает, так как они не заканчиваются, когда я пытаюсь запустить программу. Я не уверен, что происходит. Любая помощь приветствуется.
Совет: если вы не уверены, что делает ваша программа; узнайте, как использовать отладчик. Или, по крайней мере: введите некоторые заявления печати. Потому что это делает ваш код ** наблюдаемым **. И трудно догадаться, что делает ваш код, поскольку вы не даете ** всего ** код, необходимый для повторения проблемы. – GhostCat
Возможно, вы захотите использовать 'tree.set', а не' tree.add', чтобы установить значение 'ArrayList' в определенном индексе. В противном случае новый элемент вставлен в позицию (смещая последующие элементы вправо) вместо того, чтобы заменять существующее значение в этом положении. –