优先队列的应用十分广泛,包括著名的A*算法在内的多种算法,均是利用了优先队列。优先队列的实现可以利用数组与链表,但效果都不太理想,利用二叉堆实现是最高效的算法,基于最小元素的优先队列JAVA代码如下:
import edu.princeton.cs.algs4.StdOut;
/*
* priority Queue using binary heap
*/
public class MinPQ<Key extends Comparable<Key>> {
private Key[] pq;
private int N = 0;
public MinPQ(int Max) {
// TODO Auto-generated constructor stub
pq = (Key[]) new Comparable[Max + 1];
}
public boolean isEmpty() {
return N == 0;
}
public int size() {
return N;
}
public void insert(Key v) {
pq[++N] = v;
swim(N);
StdOut.println("insert:" + v);
}
public Key delMin() {
Key min = pq[1];
exch(1, N--);
pq[N + 1] = null;
sink(1);
return min;
}
private boolean less(int i, int j) {
return pq[i].compareTo(pq[j]) < 0;
}
private void exch(int i, int j) {
Key temp = pq[i];
pq[i] = pq[j];
pq[j] = temp;
}
private void swim(int k) {
while (k/2 >= 1 && less(k, k/2)) {
exch(k, k/2);
k = k/2;
}
}
private void sink(int k) {
while (k*2 <= N) {
int j = k*2;
if (j + 1 <= N && less(j + 1, j)) j++;
if (less(k, j)) break;
else { exch(k, j); k = j;}
}
}
@Override
public String toString() {
// TODO Auto-generated method stub
String string = new String();
for (int i = 1; i <= N; i++)
string += pq[i] + " ";
return string + "\n";
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MinPQ<Integer> mp = new MinPQ<Integer>(5);
mp.insert(2);
mp.insert(8);
mp.insert(-10);
mp.insert(12);
mp.insert(5);
StdOut.print(mp);
}
}