当前位置: 首页 > news >正文

算法导论学习笔记——最大优先级队列

/**
 * 最大优先级队列,例如:在一台分时计算机上进行作业高度。这种队列对要执行的各作业及它们之间的相对优先关系加以记录
 * 当一个作业做完或被中断时,用extractMax操作从所有等待的作业中,选择出具有最高优先级的作业;一个新作业则可以调用insert加入队列
 */
public class PriorQueue {

    int heapSize = 0;
    /**
     * 返回arr中最大关键字的元素,并在堆中删除,然后重新调整成最大堆
     * @param arr
     */
    int extractMax(int arr[]){
        if(heapSize<1)
            System.out.println("");
        int max = arr[0];
        arr[0] = arr[heapSize-1];
        heapSize--;
        //调用堆排序(HeapSort)中的方法把堆重新调整为最大堆
        maxHeap(arr,1,heapSize);
        return max;
    }
    /**
     * 将堆中i位置的关键字增加到key,这里的key不能小于i位置原来的关键字大小
     * @param arr
     * @param i
     * @param key
     */
    void increaseKey(int arr[],int i,int key){
        if(key<arr[i-1])
            System.out.println("");
        arr[i-1] = key;
        while(i>1&&arr[i/2-1]<arr[i-1]){
            int temp = arr[i/2-1];
            arr[i/2-1] = arr[i-1];
            arr[i-1] = temp;
            i = i/2;
        }
    }
    /**
     * 向堆中插入一个新的元素key
     * @param arr
     * @param key
     */
    void insert(int arr[],int key){
        this.heapSize++;
        arr[heapSize-1] = Integer.MIN_VALUE;
        this.increaseKey(arr, heapSize, key);
    }
    //把堆重新调整为最大堆
    void maxHeap(int arr[],int i,int heapsize){
        int largest = i;
        int p = 2*i;
        int q = 2*i + 1;
        //由于i和heapsize都是指的元素在堆中的位置而非在数组中的位置,所以涉及到数组操作时都要减1
        if(p<=heapsize&&arr[p-1]>arr[largest-1])
            largest = p;
        if(q<=heapsize&&arr[q-1]>arr[largest-1])
            largest = q;
        if(largest!=i){
            int temp = arr[i-1];
            arr[i-1]=arr[largest-1];
            arr[largest-1]=temp;
            //尽管i的左右孩子已经是最大堆,但是当前面的调整发生以后,其左右孩子就有可能不再是最大堆了,所以要重新调整成最大堆
            maxHeap(arr,largest,heapsize);
        }
    }
    //测试.....
    public static void main(String[] args) {
        int arr[]=new int[20];
        PriorQueue prior = new PriorQueue();
        for(int i =1;i<16;i++ )
            prior.insert(arr, i);
        for(int j =0;j<prior.heapSize;j++)
            System.out.println(arr[j]);
        for(int j = 1;j<6;j++)
            System.out.println(prior.extractMax(arr));
        prior.increaseKey(arr, 2, 20);
        System.out.println(prior.extractMax(arr));
    }
}


相关文章:

  • Data.xml文件找不到的解决
  • 算法导论学习笔记——快速排序算法
  • instancetype
  • CentOS下SVN使用
  • java虚拟机学习笔记——java安全模型
  • 《C++ Primer Plus(第六版)》(9)(第七章 函数 笔记和答案)
  • 算法导论学习笔记——计数排序算法
  • 本地化资源文件关键字重复的报错解决。
  • 数字签名是什么?
  • 探索推荐引擎内部的秘密:推荐引擎初探
  • 决策树
  • 算法导论学习笔记——基数排序
  • 算法导论学习笔记——桶排序
  • [java]删除数组中的某一个元素
  • 当你输入一个网址的时候,实际会发生什么?
  • 【翻译】babel对TC39装饰器草案的实现
  • 2017 前端面试准备 - 收藏集 - 掘金
  • CAP 一致性协议及应用解析
  • create-react-app做的留言板
  • interface和setter,getter
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • nodejs调试方法
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring-boot 启动时碰到的错误
  • Windows Containers 大冒险: 容器网络
  • 大主子表关联的性能优化方法
  • 工程优化暨babel升级小记
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 系统认识JavaScript正则表达式
  • 你对linux中grep命令知道多少?
  • 《码出高效》学习笔记与书中错误记录
  • #define用法
  • #Linux(权限管理)
  • #pragma once
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (过滤器)Filter和(监听器)listener
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core 6 redis操作类
  • .net 简单实现MD5
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET的数据绑定
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @Autowired自动装配
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [CentOs7]搭建ftp服务器(2)——添加用户