博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
优先队列实现
阅读量:6672 次
发布时间:2019-06-25

本文共 1615 字,大约阅读时间需要 5 分钟。

  hot3.png

/**

 * 优先队列的实现
 * 场景:我们需要获取一组元素中的最大值或者最小值,每次取出的都是最大或者最小。使用二叉树这种数据结构
 * 
 * gao.mq
 *
 */
public class MaxPQ {
    private int[] pq;
    private int N = 0;

    /**

     * 构造一个空的二叉树,物理上存储是一个数组,逻辑上理解成一个二叉树。
     * 
     * maxN
     */
    public MaxPQ(int maxN) {
        pq = new int[maxN];
    }

    public boolean isEmpty() {

        return N == 0;
    }

    public int size() {

        return N;
    }

    /**

     * 插入一个元素
     * 在插入一个元素的时候,插入的这个值可能是数组中最大的值。所以要进行一步比较操作。
     * 
     * value
     */
    public void insert(int value) {
        pq[++N] = value;
        swim(N);
    }

    /**

     * 数组插入元素时的上浮操作
     * 当前元素的索引假设是i,它的父节点则为i/2,它的子结点则为2*i和2*i+1
     * 
     * 这个操作很简单,我们只要保证索引i的值不小于索引1的时候就比较当前结点和它的父节点
     * 
     * key
     */
    private void swim(int key) {
        while (key > 1 && pq[key] > pq[key / 2]) {
            int temp = pq[key];
            pq[key] = pq[key / 2];
            pq[key / 2] = temp;
            key = key / 2;
        }
    }

    /**

     * 删除最大元素
     * 我们把最大值上浮到索引1了,所以删除只需要把数组pa[1]取出即可。
     * 这时要把第二大的元素放到第一个位置,我们把pq[N]也就是最后一个元素放入到第一个位置
     * 
     *
     */
    public int delMax() {
        int max = pq[1];
        pq[1] = pq[N--];
        pq[N + 1] = 0;
        sink(1);
        return max;
    }

    /**

     * 下沉操作
     * 找到当前结点的两个子结点,找到大的和当前结点比较。然后交换
     * 一直下浮到合适的位置
     * 
     * @param k
     */
    private void sink(int k) {
        while (2 * k <= N) {
            int j = 2 * k;
            if (j < N && less(j, j + 1)) {
                j++;
            }
            if (!less(k, j))
                break;
            int temp = pq[k];
            pq[k] = pq[j];
            pq[j] = temp;
            k = j;
        }
    }

    /**

     * 比较兄弟结点之间的大小
     * 
     * @param j
     * @param i
     * @return
     */
    private boolean less(int j, int i) {
        if (pq[j] > pq[i]) {
            return false;
        }
        return true;
    }

    public void travse() {

        for (int i = 1; i < pq.length; i++) {
            System.out.println(pq[i]);
        }
    }

    public static void main(String[] args) {

        MaxPQ pq = new MaxPQ(10);
        pq.insert(5);
        pq.insert(2);
        pq.insert(3);
        pq.insert(10);
        pq.insert(7);
        pq.delMax();
        pq.travse();
    }

转载于:https://my.oschina.net/gaomq/blog/1014841

你可能感兴趣的文章
MP3转换AAC格式哪个音频转换器好
查看>>
黑苹果装机记录
查看>>
基于Nodejs的前端灰度发布方案_20190228
查看>>
Redis实现广告缓存、并完善缓存击穿
查看>>
如何绘制最美的鱼骨图?
查看>>
什么是session?什么是cookie?session和cookie有什么区别?
查看>>
javascript引擎执行的过程的理解--语法分析和预编译阶段
查看>>
百度正式发布PaddlePaddle深度强化学习框架PARL
查看>>
迟到但重要的事
查看>>
Node.js 指南(不要阻塞事件循环或工作池)
查看>>
Java抽象类与接口的区别
查看>>
一张图让自己搞懂(mēng)原型&原型链
查看>>
前端每日实战:75# 视频演示如何用纯 CSS 创作一支摇曳着烛光的蜡烛
查看>>
.NET或将引入类型类和扩展
查看>>
Windows 使用 ln -s 创建软链接
查看>>
来看一场 AI 重建的 3D 全息世界杯比赛!
查看>>
动态权限<三>华为小米特殊机制
查看>>
Python黑帽编程2.6 模块
查看>>
远端访问MySQL
查看>>
f(f(x))=-x, x是Int32,这类函数的抽象理解
查看>>