虽然求最小值的操作可以在常数时间完成,但是,按照最小元设计的堆(也称作最小堆)在求最大元方面却无任何帮助,事实上,一个堆所蕴含的关于序的信息很有限,因此,若不对整个堆进行线性搜索,是没有办法找出任何特定的关键字的。(《数据结构与算法分析——C语言描述》之6.3.4节)
从下面第二个图也可以看出,数据仅仅只是局部有序,整体来看并无顺序可言。可以使用该方法来找出最小或者最大的数。
1 |
|
1 |
|
1 |
|
1 | gcc -o main main.c heap.c ^C |
其它应用方面。比如可能有一些作业特别重要,需要打印机一有空闲就来处理该作业。这就相当于在一系列的任务中,优先执行一个高优先级的任务。这里说一个实际案例。
在自动抄表中,集中器会自动地定时的进行抄表,并将数据上传至服务器。如果此时服务器端有手动的抄表动作,那么集中器需要暂停当前的自动抄表动作,而去执行服务器的抄表动作。一是因为一个集中器设备下面会有很多的表,完成所有的抄表动作需要一定的时间;二是提高服务器端的响应时间,属于一种人性化设计,否则服务器端可能需要等待几分钟才能看到所要的结果,给人的感觉就不好。
当然服务器端也可以实现自动抄表,集中器采集器仅仅作为数据转发设备,该方案此处不提。当时的设计是在集中器实现自动抄表。优先响应服务器的抄表指令使用的是高优先级任务的方式,即每完成一次抄表,检查是否有服务器抄表命令,如果有那么就进行一次任务调度,执行服务器抄表指令,否则继续执行自动抄表。为何需要在每次抄表完成后才去检查?这涉及到抄表的执行流程,简单说来就是:集中器发送抄表指令,表计会通过总线接收指令,之后进行应答,集中器接收数据。这个过程需要一定的时间,并且因为所有表计均挂在总线上,所以一定要等待上一次抄表完成之后才能进行下一次抄表,否则数据就会冲突。
堆排序(2021-6-11 16:48:45)
直接将数组中的数据变为堆的形式,数据取出之后还是放入数组中,结果就是升序或者降序排列。
1 |
|
运行结果如下