优先队列与堆排序
来源:互联网 发布:福利资源博客源码 编辑:程序博客网 时间:2024/06/11 05:22
本文你可以了解
1、什么是优先队列,优先队列的应用场景有哪些
2、优先队列的实现方式
3、堆排序
4、堆排序的时间复杂度
5、优先队列的应用举例
6、堆排序的应用举例
详细解释
1、优先队列
1.1概述
许多应用程序在数据处理是,需要有序的处理数据,但是不一定要求他们全部有序,或着是不一定要一次就将整个数据进行排序。例如有些我们收集了一些元素,然后处理这些元素中的最大值。这个时候,对这儿数组进行排序没有必要,这就引出我们今天介绍的优先队列。
1.2定义
优先队列时一种抽象数据类型,其最重要的操作就是删除最大元素和插入元素。
1.3应用场景
例如任务调度,我们需要取出任务队列里优先级最高的任务拿出来去执行
2、优先队列的实现方式
优先队列有好几种实现方式,我们今天介绍的主要是用堆实现的优先队列,不了解堆的童鞋可以自行百度。这里我们给出两个与堆有关的定义
1、当一颗二叉树的每个节点都大于等于它的子节点时,它被称为堆有序
2、根节点是堆有序的二叉树的最大节点。
堆的实现也有几种今天我们主要利用的是用数组来实现堆。这里我们给出以下说明:
在一个基于数组的堆中,位置k的节点的父节点位置为k/2,它的两个子节点的位置分别是2k和2k+1,这样我们就可以在不使用指针的情况下任意访问堆中的节点。
堆的两个主要算法:
1、上浮:当节点大于父节点是,将该节点和父节点进行位置交换,保证堆的有序性。
2、下沉:当节点小于子节点时,将该节点与两个子节点中相对大的节点进行位置交换。
了解到这我们基本可以建立起一个优先队列了
insert:插入一个元素利用上浮操作,交换新插入的节点和旧节点,保证堆的有序性,
del:删除最大元素后,将数组中的最后一个元素移动到堆顶,然后利用下浮操作保证堆的有序性
至此 我们就描述了优先队列主要操作的步骤。
3、堆排序
我们可以把任意一个优先队列变为每一个排序的方式,将所有元素插入一个小定堆中,然后不断的删除堆顶元素,并且输出,其输出结果就是排序后的结果。这种排序方式就是堆排序。
堆排序可以分为两个阶段
1、构造堆:
堆的构造我们可以用下沉的方式,对数组前1/2的元素做下沉操作,得到的就是一个有序的堆。 时间复杂度为N
2、调整堆(插入删除后 为保证堆的有序性需要对其进行调整)
堆的大部分操作时在第二阶段完成的。这里我们讲堆顶的最大元素删除,然后将数组最后一个元素放到队定,然后执行下沉操作,直到堆有序。时间复杂度logn
不断重复第二步骤即可完成堆排序。时间复杂度 Nlogn
4、优先队列应用举例
问题:假设有三个文件 m1txt ,m2.txt m3.txt 每个文件分别存放了n个字符,且每个文件的字符序列是有序的。要求对这三个文件的字符合并排序
应用该该问题的最优数据结构是最小索引优先队列
最小优先队列,详细代码见附件。
这里介绍一下为什么用索引优先队列,而不直接用队列,因为索引优先队列,在insert的时候能用索引在标识插入的数据是哪个文件的,在删除的时候,增补的数据一定是要从删除的文件中去取。
5、堆排序举例
这个问题例子请移步http://blog.csdn.net/v_JULY_v/article/details/6256463堆在这种降低了查找的复杂度,所以性能更高一些。
0 0
- 堆排序与优先队列
- 优先队列与堆排序
- 优先队列与堆排序
- 堆与堆排序—优先队列
- 优先队列-堆排序
- 堆、堆排序、优先队列
- 堆 优先队列 堆排序
- 优先队列与堆
- 优先队列与堆
- 堆与优先队列
- 优先队列 与 堆
- 堆与优先队列
- 排序算法3-堆排序与优先队列
- 排序算法08:优先队列与堆排序
- 浅析数据结构与算法5--优先队列与堆排序
- 堆排序和 优先队列
- 堆排序和优先队列
- 堆排序,优先队列实现
- ViewFlipper控件入门
- 操作系统页面置换算法之最近最少使用算法(LRU)
- Java基础课程-面向对象
- Eclipse快捷键 10个最有用的快捷键
- MariaDB是未来的开源方向
- 优先队列与堆排序
- libc.so.6: file format not recognized; treating as linker script & libc.so.6:1: syntax error
- hello world
- linux strace命令
- HDU - 2222 - Keywords Search(AC自动机)
- Properties Editor插件 在Eclipse中以中文书写及显示Properties文件
- CSS的长度单位适配方案
- linux sh 去重的几种方法实例
- Linux makefile 教程