此堆类运行并且不会导致任何错误。我遇到的问题是当我从堆中删除并打印出每个条目的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