优先队列:能够插入元素,能够删除最大元素。
堆(二叉堆):父节点大于等于子节点,左右子节点大小不定;
在一个堆中,位置为k的节点的父节点位置为⌊k/2⌋(向下取整符号),子节点为2k和2k+1。
//基于堆的优先队列,《算法》p202
package algorithm;
public class MaxPQ_p202 {
private int[] pq = new int[100];
int N = 0;
public void insert(int a){
pq[++N] = a;
swim(N);
}
public int delMax(){
int Max = pq[1];
exch(1, N--);
pq[N+1] = 0;
sink(1);
return Max;
}
private void swim(int k){ //上浮
while((k > 1) && (pq[k/2] < pq[k])){
exch(k/2, k);
k = k/2;
}
}
private void sink(int k){ //下沉
while(2*k <= N){
int j = 2*k;
if ((j < N) && (pq[j] < pq[j+1])){j++;}
if(!(pq[k] < pq[j])) break;
exch(k, j);
k = j;
}
}
private void exch(int i, int j){ //交换
int temp = pq[i];
pq[i] = pq[j];
pq[j] = temp;
}
public void display(){
for(int i = 1; i <= N; i++){
System.out.println(pq[i]);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MaxPQ_p202 test = new MaxPQ_p202();
test.insert(0);
test.insert(1);
test.insert(2);
test.insert(3);
test.insert(4);
test.insert(5);
System.out.println("插入0~5后:");
test.display();
test.delMax();
System.out.println("删除最大值后:");
test.display();
}
}
结果
插入0~5后:
5
3
4
0
2
1
删除最大值后:
4
3
1
0
2