使用基于数组的堆的优先级队列ADT

时间:2014-04-12 23:40:29

标签: java heap adt priority-queue

此堆类运行并且不会导致任何错误。我遇到的问题是当我从堆中删除并打印出每个条目的pri值时,我可以看到它们没有按顺序排列。我很确定这是因为涓滴和/或涓滴方法无法正常工作。

这是我的Heap,它实现了我的主队列类。

public class Heap<E> implements PriQue<E>{
private static class Entry<E>{
    int pri;
    E data;
    Entry(int p, E d){
        this.pri=p;
        this.data=d;
    }
    public E getData(){
        return data;
    }
}
Entry<E> [] heap;
int count;

public Heap(int size){
    heap= new Entry[size];
    count=0;
}

@Override
public void insert(int pri, E data) {
    Entry<E> newEntry = new Entry<E>(pri, data);
    heap[count]=newEntry;
    trickleUp(count++);
}

public void trickleUp(int idx){
    int parent = (idx-1)/2;
    Entry<E> bottom = heap[idx];
    while(idx>0 && heap[parent].pri<bottom.pri){
        heap[idx]=heap[parent];
        idx=parent;
        parent=(parent-1)/2;
    }
    heap[idx]=bottom;
}

@Override
public E remove() {
    E tmp = heap[--count].getData();
    trickleDown(0);
    return tmp;
}

public void trickleDown(int idx){
    int largerChild;
    Entry<E> top = heap[idx];
    while(idx<count/2){
        int lChild = 2*idx+1;
        int rChild = lChild+1;
        if(rChild<count && heap[lChild].pri<heap[rChild].pri){
            largerChild=rChild;
        }else{
            largerChild=lChild;
        }
        if(top.pri>=heap[largerChild].pri){
            break;
        }
        heap[idx]=heap[largerChild];
        idx=largerChild;
    }
    heap[idx]=top;
}

@Override
public boolean isEmpty() {
    return count==0;
}

}

这是主要队列类。

public interface PriQue<E> {
void insert(int pri, E data);
E remove(); // return null when empty
boolean isEmpty();
}

Entrys的钥匙是:24,5,2,10,6,11

当我打电话删除并打印出钥匙时,我得到了这个:2,6,5,11,10,24

我想要的输出应为:2,5,6,10,11,24

0 个答案:

没有答案