JAVA 堆 与 优先级队列 关系

本文介绍了JAVA中的堆数据结构,包括大堆和小堆的概念及其在筛选最大值和最小值中的作用。堆排序通过向上和向下调整实现。接着讲解了优先级队列,它是处理优先级对象的数据结构,常利用堆来实现。入队操作是尾插后调整,poll操作涉及根元素交换和堆整理。
摘要由CSDN通过智能技术生成

一 : 堆
什么是堆?
堆可以理解成一个完全二叉树
在这里插入图片描述
只不过堆是以数组的形式表现出来的
满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆4. 反之,则是小堆,或者小根堆,或者最小堆。

大堆与小堆可以用于筛选数组之中最大值或是最小值,
比如在千万级别的数据中找到前五个最大的值,那么就要建立一个有五个元素的小堆,每一次筛选,如果筛选的元素比堆顶就找到堆顶最小的元素将其换下来

那么怎么进行堆的排序呢?
有向上调整和向下调整

如果是一个不规则的堆,那么就要从最后一个非叶子节点向下调整
这里以大堆举例

public static void shiftDownBig(int[] arr, int sz, int parent){
   
        int child = 2 * parent + 1;  // left child

        // 从parent节点开始,一直调整到叶子节点结束
        while(child < sz){
   
            //right child : child + 1 从两个孩子节点中选一个最大的
            if(child + 1 < sz && arr[child + 1] > arr[child]){
   
                ++child;
            }
            if(arr[child] > arr[parent]){
   
                //如果child 大于 parent, 向下调整,交换值
                swap(arr, child, parent);
                //更新,继续向下调整
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值