二叉堆构造优先队列
public class MaxPQ <Key extends Comparable<Key>> {// 存储元素的数组private Key[] pq;// 当前 Priority Queue 中的元素个数private int N = 0;public MaxPQ(int cap) {// 索引 0 不用,所以多分配一个空间pq = (Key[]) new Comparable[cap + 1];}/* 返回当前队列中最大元素 */public Key max() {return pq[1];}// 父节点的索引int parent(int root) {return root / 2;}// 左孩子的索引int left(int root) {return root * 2;}// 右孩子的索引int right(int root) {return root * 2 + 1;}/* 插入元素 e */public void insert(Key e) {N++;// 先把新元素加到最后pq[N] = e;// 然后让它上浮到正确的位置swim(N);}/* 删除并返回当前队列中最大元素 */public Key delMax() {// 最大堆的堆顶就是最大元素Key max = pq[1];// 把这个最大元素换到最后,删除之exch(1, N);pq[N] = null;N--;// 让 pq[1] 下沉到正确位置sink(1);return max;}/* 上浮第 k 个元素,以维护最大堆性质 */private void swim(int k) {while(k>1 && less(parent(k),k)) {exch(parent(k),k);k = parent(k);}}/* 下沉第 k 个元素,以维护最大堆性质 */private void sink(int k) {// 如果沉到堆底,就沉不下去了while (left(k) <= N) {// 先假设左边节点较大int older = left(k);// 如果右边节点存在,比一下大小if (right(k) <= N && less(older, right(k)))older = right(k);// 结点 k 比俩孩子都大,就不必下沉了if (less(older, k)) break;// 否则,不符合最大堆的结构,下沉 k 结点exch(k, older);k = older;}}/* 交换数组的两个元素 */private void exch(int i, int j) {Key temp = pq[i];pq[i] = pq[j];pq[j] = temp;}/* pq[i] 是否比 pq[j] 小? */private boolean less(int i, int j) {return pq[i].compareTo(pq[j]) < 0;}public static void main(String[] args) {// TODO Auto-generated method stub}}
java库的优先队列
- peek()//返回队首元素
- poll()//返回队首元素,队首元素出队列
- add()//添加元素
- size()//返回队列元素个数
- isEmpty()//判断队列是否为空,为空返回true,不空返回false
