二叉堆实现优先队列

最大堆:

每个节点都大于等于它的两个子节点

堆的操作:
  • swim(k):上浮第k个元素
  • sink(k):下沉第k个元素
优先队列
  • 删除:delMax(最小堆delMin)
  • 插入:insert
代码框架
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];
    }

    /* 插入元素 e */
    public void insert(Key e) {...}

    /* 删除并返回当前队列中最大元素 */
    public Key delMax() {...}

    /* 上浮第 k 个元素,以维护最大堆性质 */
    private void swim(int k) {...}

    /* 下沉第 k 个元素,以维护最大堆性质 */
    private void sink(int k) {...}

    /* 交换数组的两个元素 */
    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;
    }

    /* 还有 left, right, parent 三个方法 */
}
实现swim
private void swim(int k) {
    while(k > 1 && less(parent(k), k)) {
        exch(parent(k), k);
        k = parent(k);
    }
}
实现sink
private void sink(int k) {
    while(left(k) <= N) {
        // 找出最大的孩子节点
        int child = left(k);
        if(right(k) <= N && less(child, right(k)))
            child = right(k);
        if(less(child, k))
            break;
        exch(k, child);
        k = child;
    }
}
实现删除
private Key delMax() {
    int del = pq[1];
    exch(1, N);
    pq[N] = null;
    N--;
    sink(1);
    return del;
}
实现插入
private void insert(Key e) {
    N++;
    pq[N] = e;
    swim(N);
    return;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值