Я пытаюсь реализовать очередь приоритетов, используя minheap, но мои объекты выходят из очереди в неправильном порядке. Моя интуиция подсказывает мне, что проблема связана с моими методами просеивания вверх или вниз в очереди, но я не вижу, где проблема. Мог ли кто-нибудь взглянуть на мои алгоритмы и посмотреть, есть ли что-то неправильное, что сразу видно? Заранее спасибо.Реализация очереди приоритетов с минимальной кучей
Вот метод для просеивания вниз:
private void walkDown(int i) {
if (outOfBounds(i))
{
throw new IndexOutOfBoundsException("Index not in heap : " + i);
}
int current = i;
boolean right;
Customer temp = this.heap[i];
while (current < (this.size >>> 1))
{
right = false;
if (right(current) < this.size &&
this.comparator.compare(this.heap[left(current)],
this.heap[right(current)]) > 0)
{
right = true;
}
if (this.comparator.compare(temp, right ? this.heap[right(current)]
: this.heap[left(current)]) < 0)
{
break;
}
current = right ? right(current) : left(current);
this.heap[parent(current)] = this.heap[current];
}
this.heap[current] = temp;
}
И метод для просеивания до:
private void walkUp(int i) {
if (outOfBounds(i))
{
throw new IndexOutOfBoundsException("Index not in heap : " + i);
}
int current = i;
Customer temp = this.heap[i];
while (current > 0)
{
if (this.comparator.compare(this.heap[current],
this.heap[parent(current)]) >= 0)
{
break;
}
this.heap[current] = this.heap[parent(current)];
current = parent(current);
}
this.heap[current] = temp;
}
EDIT:
Сравнения метод определяется следующим образом:
@Override
public int compare(Customer cust1, Customer cust2) {
return cust1.priority() - cust2.priority();
}
Не могли бы вы отправить свой метод сравнения? В этом случае кажется, что он используется для большей части логики. –
также есть глобальные объекты, называемые слева и справа? Вероятно, не очень хорошая идея также иметь логическое имя справа. –