- 1、本文档共36页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
堆与堆排序 软件学院 王建文 ? 一、堆和堆排序的概念 二、堆的调整 三、建堆 四、堆排序 例: 下面序列为堆,对应的完全二叉树分别为: 堆的应用------优先级队列 服务排队------见课本200, 例5.1 堆排序 堆排序 若在输出堆顶的最小值(最大值)后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素的次小值(次大值)……如此反复,便能得到一个有序序列,这个过程称之为堆排序。 实现堆排序需解决两个问题: 1、如何由一个无序序列建成一个堆? 2、如何在输出堆顶元素后,调整剩余元素为一个新的堆? 下面先讨论第二个问题: 一、堆和堆排序的概念 ? 二、堆的调整 三、建堆 四、堆排序 堆调整与数组变化的关系 加入元素时向上调整 删除元素时向下调整 加入元素 Adding an Entry Begin at next available position for a leaf Follow path from this leaf toward root until find correct position for new entry As this is done Move entries from parent to child Makes room for new entry Adding an Entry Adding an Entry Adding an Entry Adding an Entry----代码见课本203 Algorithm for adding new entry to a heap 删除元素 Removing the Root 你能画出删除堆顶元素时相应数组的变化吗? 删除元素代码见课本204 一、堆和堆排序的概念 二、堆的调整 ? 三、建堆 四、堆排序 第一种方法: 把一个数组看成两部分,左边是堆,右边是还没加入堆的元素,步骤如下: 1、数组里的第一个元素自然地是一个堆 2、然后从第二个元素开始,一个个地加入左边的堆,当然,每加入一个元素就破坏了左边元素堆的性质,得重新把它调整为堆 创建堆 时间复杂度 该方法创建堆的时间复杂度为O (n log n) 第二种方法:自底向上创建堆 可以看出: 对一个无序序列反复“筛选”就可以得到一个堆 即:从一个无序序列建堆的过程就是一个反复“筛选”的过程。 那么:怎样判断一个序列是一个堆?或者说,建堆操作从哪儿着手? 显然: 单结点的二叉树是堆;在完全二叉树中所有以叶子结点(序号i n/2)为根的子树是堆。 这样,我们只需依次将以序号为n/2,n/2-1,……, 1的结点为根的子树均调整为堆即可。 即:对应由n个元素组成的无序序列,“筛选”只需从第n/2个元素开始。 由于堆实质上是一个完全二叉树,那么我们可以顺序存储一个堆。 下面以一个实例介绍建一个小根堆的过程。 例:有关键字为49,38,65,97,76,13,27,49的一组记录,将其按关键字调整为一个小根堆。 Heapsort Heapsort Heapsort Heapsort 堆排序算法实现 课本290页 Analysis We visualize the worst-case time of a downheap with a proxy path that goes first right and then repeatedly goes left until the bottom of the heap (this path may differ from the actual downheap path) Since each node is traversed by at most two proxy paths, the total number of nodes of the proxy paths is O(n) Thus, bottom-up heap construction runs in O(n) time Bottom-up heap construction is faster than n successive insertions and speeds up the first phase of heap-sort 时间复杂度分析 该方法创建堆的时间复杂度为O( n ) 证明过程请看教材页290页 堆排序的时间主要耗费在建初始堆和调整建新堆时进行的反复“筛选”上。 堆排序在最坏情况下,其时间复杂度也为O(nlog2n), 这是堆排序的最大
文档评论(0)