优先队列与堆排序

来源:互联网 发布:福利资源博客源码 编辑:程序博客网 时间: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
原创粉丝点击