优先队列(Priority Queue)

优先队列的应用十分广泛,包括著名的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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值