优先队列(堆)

2023-11-07

设计一个程序模仿操作系统的进程管理问题,进 程服务按优先级高的先服务,同优先级的先到先服务的管理 原则。设文件task.txt中存放了仿真进程服务请求,其中第 一列是进程任务号,第二列是进程的优先级。

1 30

2 20

3 40

4 20

5 0

#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN 10
typedef struct
{
    int pri[MAX_LEN];  //优先级
    int num[MAX_LEN]; //进程服务号
    int n;
}Heap;
/*向大根堆中插入一个元素*/
void Insert(Heap *heap,int x,int y)
{
    int i;
    if(heap->n!=MAX_LEN-1)
    {
        heap->n++;
        i=heap->n;
        //当插入的元素优先级更大,或者优先级相同服务号更小,循环
        while((i !=1)&&((x>heap->pri[i/2])||(x==heap->pri[i/2]&&y<heap->num[i/2])))
        {
            heap->pri[i]=heap->pri[i/2];
            heap->num[i]=heap->num[i/2];
            i=i/2;
        }
        heap->pri[i]=x;
        heap->num[i]=y;
    }
}
/*删除堆中最大元素*/
void Delete(Heap *heap)
{
    int parent=1,child=2,pri,num,tmp1,tmp2;
    if(heap->n==0)
    {
        printf("堆空!\n");
        return;
    }
    pri = heap->pri[1];
    num = heap->num[1];
    printf("进程优先级%d  服务号%d\n",pri,num);
    tmp1 = heap->pri[heap->n];
    tmp2 = heap->num[heap->n];
    heap->n--;
    while(child<=heap->n)
    {
        if((child<heap->n)&&((heap->pri[child]<heap->pri[child+1])\
            ||(heap->pri[child]==heap->pri[child+1]&&heap->num[child]>heap->num[child+1])))
            child++;
        if((tmp1>heap->pri[child])||(tmp1==heap->pri[child]&&tmp2<heap->num[child]))
            break;
        heap->pri[parent]=heap->pri[child];
        heap->num[parent]=heap->num[child];
        parent=child;
        child*=2;
    }
    heap->pri[parent]=tmp1;
    heap->num[parent]=tmp2;
}
/*输入进程*/
void Readfile(Heap *heap)//从task.txt中读入数据
{
    FILE *fp;
    int x,y,i;
    fp=fopen("task.txt","r");
    if(fp==NULL)
    {
        printf("读取文件task.txt失败!\n");
        exit(0);
    }
    printf("从文件中读取数据如下:\n");
    for(i=0;i<5;i++)
    {
        fscanf(fp," %d",&x);
        fscanf(fp," %d",&y);
        printf("进程服务号%d  优先级%d\n",x,y);
        Insert(heap,y,x);
    }
    fclose(fp);
}
int main()
{
    Heap heap;
    heap.n=0; //创建一个空堆
    Readfile(&heap);
    printf("\n进程排序后:\n");
    while(heap.n!=0)
    {
        Delete(&heap);
    }
    return 0;
}

测试截图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优先队列(堆) 的相关文章

  • 将二叉树转为有序的双向链表

    一 题目要求 输入一棵二叉排序树 现在要将该二叉排序树转换成一个有序的双向链表 而且在转换的过程中 不能创建任何新的结点 只能调整树中的结点指针的指向来实现 include
  • Sort List

    Sort a linked list in O n log n time using constant space complexity 题目要求用 O n log n 的时间复杂度和常数的空间复杂度来进行链表排序 O nlogn 的排序算
  • PCL—低层次视觉—点云分割(RanSaC)

    点云分割 点云分割可谓点云处理的精髓 也是三维图像相对二维图像最大优势的体现 不过多插一句 自Niloy J Mitra教授的Global contrast based salient region detection出现 最优分割到底鹿死
  • 链表和线性表的优缺点

    链表和线性表的优缺点 作为我们最先接触的两个数据结构 链表和线性表的优缺点都较为明显 并且二者互相补足 文章目录 链表和线性表的优缺点 线性表 线性表的组成 线性表的缺点 线性表的优点 链表 链表的组成 链表的优点 链表的缺点 总结 线性表
  • DDP入门

    DDP 即动态动态规划 可以用于解决一类带修改的DP问题 我们从一个比较简单的东西入手 最大子段和 带修改的最大子段和其实是常规问题了 经典的解决方法是用线段树维护从左 右开始的最大子段和和区间最大子段和 然后进行合并 现在我们换一种方法来
  • 亚利桑那州立大学周纵苇:研习 U-Net ——现有的分割网络创新

    雷锋网AI研习社按 经典的 Encoder Decoder 结构在目标分割问题中展现出了举足轻重的作用 然而这样一个相对固定的框架使得模型在感受野大小和边界分割精度两方面很难达到兼顾 本次公开课 讲者以 U Net 为案例分析 总结现有的分
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • UE4命令行使用,解释

    命令行在外部 从命令行运行编辑项目 1 导航到您的 LauncherInstall VersionNumber Engine Binaries Win64 目录中 2 右键单击上 UE4Editor exe 的可执行文件 并选择创建快捷方式
  • 图 - Java实现无向带权图的邻接矩阵表示法

    图 Java实现无向带权图的邻接矩阵表示法 1 图 1 1 图的介绍 图 Graph 是一种复杂的非线性表结构 图中的元素我们就叫做顶点 vertex 图中的一个顶点可以与任意其他顶点建立连接关系 我们把这种建立的关系叫做边 edge 跟顶
  • Unique Binary Search Trees -- LeetCode

    原题链接 http oj leetcode com problems unique binary search trees 这道题要求可行的二叉查找树的数量 其实二叉查找树可以任意取根 只要满足中序遍历有序的要求就可以 从处理子问题的角度来
  • 如何防止过拟合和欠拟合

    过拟合和欠拟合是模型训练过程中经常出现的问题 两种情况正好相反 现将两者的定义及如何防止进行简要总结 1 过拟合 1 1 定义 是指模型对于训练数据拟合呈现过当的情况 反映到评估指标上就是模型在训练集上的表现很好 但是在测试集上的表现较差
  • 算法问题实战策略

    算法问题实战策略 基本信息作者 韩 具宗万 译者 崔盛一出版社 人民邮电出版社ISBN 9787115384621上架时间 2015 2 4出版日期 2015 年3月开本 16开页码 738版次 1 1 内容简介 算法问题实战策略 本书收录
  • 算法学习——贪心算法之币种统计

    算法描述 币种统计 单位给每一位员工发工资 精确到元 为了保证不临时换零钱 使得每个员工取款的张数最少 在取工资前统计所有员工所需要的各种票面的张数 约定票种为100 50 20 10 5 2 1元 并验证币种统计是否正确 算法思路 算法描
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • 区块链中的哈希算法

    区块链中的密码学 密码学在区块链中的应用主要有两个 哈希算法与非对称加密算法 这次主要对哈希算法进行详细的说明 哈希算法 哈希算法的特点有 1 输入可以为任意大小的字符串 2 产生固定大小的输出 3 可以在合理的时间内算出输出值 若要满足密
  • 【数据结构入门精讲 | 第二篇】一文讲清算法复杂度

    上篇文章中我们引入了算法 数据结构 数据类型等概念 而要想衡量一个算法与数据结构是否为优质的 就需要一个衡量标准 这个衡量标准也是在我们实现一个好的算法时要遵循的原则 目录 基本概念 渐进性态 渐进性态数学表征 算法复杂度的运算 顺序搜索算
  • C++ AVL树(四种旋转,插入)

    C AVL树 四种旋转 插入 一 AVL树的概念及性质 二 我们要实现的大致框架 1 AVL树的节点定义 2 AVL树的大致框架 三 插入 1 插入逻辑跟BST相同的那一部分 2 修改平衡因子
  • 从源码角度来谈谈 HashMap

    HashMap的知识点可以说在面试中经常被问到 是Java中比较常见的一种数据结构 所以这一篇就通过源码来深入理解下HashMap 1 HashMap的底层是如何实现的 基于JDK8 1 1 HashMap的类结构和成员 HashMap继承

随机推荐

  • oracle 释放过度使用的Undo表空间

    故障现象 UNDO表空间越来越大 长此下去最终数据因为磁盘空间不足而崩溃 问题分析 产生问题的原因主要以下两点 1 有较大的事务量让Oracle Undo自动扩展 产生过度占用磁盘空间的情况 2 有较大事务没有收缩或者没有提交所导制 说 明
  • linux运行directory,我在linux里用命令出来is a directory是怎么回事

    使用的命令应该是针对文件的命令 在使用过程命令中把参数指定成了目录 所以linux报错说 这是一个目录 可以理解为linux在提醒 这是一个目录不是文件 这个命令应该是针对文件的 扩展资料 参数 c 建立一个压缩文件的参数指令 create
  • 【程序设计训练】4-12 疫情期间

    问题描述 正值新冠疫情期间 阿迪没法返回学校学习 他希望通过参加一些比赛来提高一下编程技能 同时做做运动 他收集了接下来的 n 天里每一天的信息 包括健身房是否开放 或者互联网上是否有程序设计竞赛 第 i 天可以有以下四种情况之一 该天健身
  • MySQL最全整理!java与或非逻辑符号

    内存模型 内存模型定义为什么要有内存模型为什么要重排序 重排序在什么时候排如何约束重排序规则happens before 什么是顺序一致性 CAS 实现的原理 是阻塞还是非阻塞方式 什么时候用 使用时需要考虑的问题 处理器和 Java 分别
  • jmeter与jenkins集成

    需求 通过jenkins来运行jmeter接口测试用例文件 平台 win10 原理 任何可以通过命令行执行的 都可以集成至jenkins 在jenkins构建中 执行winodws命令 调用jmeter 并执行jmx文件 最后生成测试报告
  • 可控硅

    可控硅在控制极加上合适的触发电流 可控硅就能够从断开状态变成为导通状态 这时 我们取消控制极的触发电流 但可控硅仍然能维持导通状态 如果流过可控硅的电流开始变小 当小于维持导通的能力时 可控硅才关断 直到下次触发时才会导通
  • 人工智能 Linux(三)

    人工智能 Linux 三 一 指令 1 df指令 作用 查看磁盘空间 语法 df h h 以可读性较高的形式展示大小 2 free指令 作用 查看内存使用情况 语法 free m m 表示以mb为单位查看 3 head指令 作用 查看一个文
  • SpringBoot启动时打印的时间是如何计算的?

    一 现象 我们都知道SpringBoot启动时会打印时间 那么内部是如何计算的呢 二 本质 获取时间间隔 计算秒数 Started springBoot in 20 763 seconds 记录开始的毫秒数 计算毫秒数 Root WebAp
  • 【模板】重载运算符

    重载string 以日期类CDate为例 class CDate public int y m d CDate int y int m int d y y m m d d operator string string s stringstr
  • CCAnimation类 参考

    http www cocos2dchina com documentation interface c c animation html
  • UPLOAD labs 第三关

    看源码 is upload false msg null if isset POST submit if file exists UPLOAD PATH deny ext array asp aspx php jsp file name t
  • QT中的this指针什么意思?namespace又是什么意思?

    初学者对于qt中的this指针会摸不着头脑 下面我谈谈自己的理解 结论 this指针 指的就是qt designer里面ui界面 也就是xxx ui文件 举个例子 现在我有三个文件 分别是server h头文件 server cpp源文件
  • Spring 根据Bean注册的名称获取Bean对象

    根据Bean注册的名称获取Bean对象 一个通过Bean名称获取Bean的对象实例的一个类 现在复习下Spring 再此处记录下 package net shopxx util import org springframework bean
  • 二叉树层次遍历如何判断当前结点是哪层的?

    二叉树层次遍历就是按每层从左到右 一般是从左到右 若想从右到左也很简单 的次序遍历结点 下面是一个简单的例子 这棵二叉树层次遍历的结果是 1 2 3 4 5 实现层次遍历一般是用队列 思路还是比较简单 1 首先把根结点入队 2 若队列不为空
  • mac 完全卸载python

    这里主要是卸载pkg安装的python 第一步 删除框架 sudo rm rf Library Frameworks Python framework Versions 3 11 第二步 删除应用目录 sudo rm rf Applicat
  • 解决Module not found: Error: ‘element-plus/lib/theme-chalk/index.css‘,通过下载插件,使用的是vue ui项目仪表盘

    1 首先在package json中查看vue版本和element ui版本 2 找到element ui官网https element eleme cn zh CN component quickstart 点击element ui 3
  • STM32定时器-基本定时器

    目录 定时器分类 基本定时器功能框图讲解 基本定时器功能 时钟源 计数器时钟 计数器 自动重装载寄存器 定时时间的计算 定时器初始化结构体详解 实验 定时器分类 STM32F1 系列中 除了互联型的产品 共有 8 个定时器 分为基本定时器
  • 初识Electron开发桌面应用

    Electron是什么 Electron 基于 Chromium 和 Node js 让你可以使用 HTML CSS 和 JavaScript 构建跨平台 mac window linux 桌面应用 Electron开发环境的搭建 首先安装
  • 数据预测之BP神经网络具体应用以及matlab代码(转)

    1 具体应用实例 根据表2 预测序号15的跳高成绩 表2 国内男子跳高运动员各项素质指标 序号 跳高成绩 30行进跑 s 立定三级跳远 助跑摸高 助跑4 6步跳高 负重深蹲杠铃 杠铃半蹲系数 100 s 抓举 1 2 24 3 2 9 6
  • 优先队列(堆)

    设计一个程序模仿操作系统的进程管理问题 进 程服务按优先级高的先服务 同优先级的先到先服务的管理 原则 设文件task txt中存放了仿真进程服务请求 其中第 一列是进程任务号 第二列是进程的优先级 1 30 2 20 3 40 4 20