最大优先队列类为:
//基于堆结构的最大值优先的优先队列
public class MaxPrimaryQueue<Key extends Comparable<Key>>{
//用于保存堆的元素
private Key[] pq;
//用于保存堆中目前存在的元素个数
private int heapsize=0;
//构造方法,创建制定大小的优先队列
public MaxPrimaryQueue(int maxN) {
pq = (Key[])new Comparable[maxN+1];
}
//插入一个元素
public void insert(Key key) {
heapsize=heapsize+1;
pq[heapsize]=key;
swim(heapsize);
}
//删除并返回优先队列中最大元素
public Key deleteMax() {
Key temp = pq[1];
exchange(1,heapsize);
pq[heapsize]=null;
heapsize=heapsize-1;
sink(1);
return temp;
}
//返回元素个数
public int size() {
return this.heapsize;
}
//判断是否没有元素
public boolean isEmpty() {
return this.heapsize==0;
}
//上浮一个元素
private void swim(int k) {
while(k>1&&less(k/2,k)) {
exchange(k,k/2);
k=k/2;
}
}
//下沉一个元素
private void sink(int k) {
while(k*2<=heapsize) {
if(k*2<heapsize&&(less(k,2*k)||less(k,2*k+1))) {
if(less(2*k,2*k+1)) {
exchange(k,2*k+1);
k=2*k+1;
}else {
exchange(k,2*k);
k=2*k;
}
}else {
return;
}
}
}
//判断pq[i]是否小于等于pq[j]
private boolean less(int i,int j) {
if(pq[i].compareTo(pq[j])<=0) {
return true;
}else {
return false;
}
}
//交换两个元素
private void exchange(int i,int j) {
Key temp = pq[i];
pq[i] = pq[j];
pq[j] = temp;
}
}
测试:
public class MaxPrimaryQueueTest {
public static void main(String[] args) {
MaxPrimaryQueue<Integer> queue = new MaxPrimaryQueue<Integer>(100);
queue.insert(5);
queue.insert(4);
queue.insert(9);
queue.insert(3);
queue.insert(100);
queue.insert(52);
queue.insert(47);
int size = queue.size();
for(int i=0;i<size;i++) {
System.out.println(queue.deleteMax());
}
}
}
结果: