华师本科生数据结构课件 第三章 堆排序与基数排序.ppt
《华师本科生数据结构课件 第三章 堆排序与基数排序.ppt》由会员分享,可在线阅读,更多相关《华师本科生数据结构课件 第三章 堆排序与基数排序.ppt(25页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、3.3.3 堆排序(Heap Sort),1、堆的定义,n个关键字序列Kl,K2,Kn称为堆,当且仅当该序列满足如下性质(简称为堆性质): (1) Ki K2i 且 Ki K2i+1 (小顶堆) 或 (2) Ki K2i 且 Ki K2i+1 (大顶堆) (1in/2),若将此序列所存储的向量R1.n看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树: 树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。,(大顶堆),(小顶堆),(小根堆) (最小堆),(大根堆) (最大堆),例:有序列T1=(08, 25, 49, 46, 58, 67)和序列T2
2、=(91, 85, 76, 66, 58, 67, 55),判断它们是否 “堆”?,逻辑结构:,存储结构:,2、大根堆和小根堆,根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆。,注意: 堆中任一子树亦是堆。 以上讨论的堆实际上是二叉堆(Binary Heap),类似地可定义k叉堆。,3、堆的特点,堆排序(HeapSort)是一树形选择排序。 堆排序的特点是:在排序过程中,将Rl.n看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最
3、小)的记录。,4、堆排序与直接插入排序的区别,直接选择排序中,为了从R1.n中选出关键字最小的记录,必须进行n-1次比较,然后在R2.n中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。 堆排序可通过树形结构保存部分比较结果,可减少比较次数。,5、堆排序,堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。,(1)用大根堆排序的基本思想, 先将初始文件R1.n建成一个大
4、根堆,此堆为初始的无序区 再将关键字最大的记录R1(即堆顶)和无序区的最后一个记录Rn交换,由此得到新的无序区R1.n-1和有序区Rn,且满足 R1.n-1.keys Rn.key 由于交换后新的根R1可能违反堆性质,故应将当前无序区R1.n-1调整为堆。然后再次将R1.n-1中关键字最大的记录R1和该区间的最后一个记录Rn-1交换,由此得到新的无序区R1.n-2和有序区Rn-1.n,且仍满足关系R1.n-2.keysRn-1.n.keys,同样要将R1.n-2调整为堆。 直到无序区只有一个元素为止。,(2)大根堆排序算法的基本操作, 初始化操作:将R1.n构造为初始堆; 每一趟排序的基本操作
5、:将当前无序区的堆顶记录R1和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。,注意:只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻,堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。,(3)堆排序的算法,void HeapSort(SeqIAst R) /对R1.n进行堆排序,不妨用R0做暂存单元 int i; BuildHeap(R); /将R1-n建成初始堆for(i = n; i 1;i-) /对当前无序区R1.i
6、进行堆排序,共做n-1趟。 R0 = R1; /将堆顶和堆中最后一个记录交换 R1 = Ri; Ri = R0; Heapify(R, 1, i-1);/将R1.i-1重新调整为堆,仅有R1可能违反堆性质 ,(4)BuildHeap和Heapify函数的实现,Heapify函数思想方法 每趟排序开始前Rl.i是以R1为根的堆,在R1与Ri交换后,新的无序区R1.i-1中只有R1的值发生了变化,故除R1可能违反堆性质外,其余任何结点为根的子树均是堆。因此,当被调整区间是Rlow.high时,只须调整以Rlow为根的树即可。 筛选法调整堆 Rlow的左、右子树(若存在)均已是堆,这两棵子树的根R2
7、low和R2low+1分别是各自子树中关键字最大的结点。若Rlow.key不小于这两个孩子结点的关键字,则Rlow未违反堆性质,以Rlow为根的树已是堆,无须调整;否则必须将Rlow和它的两个孩子结点中关键字较大者进行交换,即Rlow与Rlarge(Rlarge.key=max(R2low.key,R2low+1.key)交换。交换后又可能使结点Rlarge违反堆性质,同样由于该结点的两棵子树(若存在)仍然是堆,故可重复上述的调整过程,对以Rlarge为根的树进行调整。此过程直至当前被调整的结点已满足堆性质,或者该结点已是叶子为止。上述过程就象过筛子一样,把较小的关键字逐层筛下去,而将较大的关
8、键字逐层选上来。因此,有人将此方法称为筛选法。,BuildHeap的实现要将初始文件Rl.n调整为一个大根堆,就必须将它所对应的完全二叉树中以每一结点为根的子树都调整为堆。显然只有一个结点的树是堆,而在完全二叉树中,所有序号in/2的结点都是叶子,因此以这些结点为根的子树均已是堆。这样,我们只需依次将以序号为n/2,n/2 -1,1的结点作为根的子树都调整为堆即可。,大根堆排序实例演示,(5)堆排序算法分析,堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。 堆排序的最坏时间复杂度为O(nlgn)。堆排序的平均性能较接近于最坏性能。 由于建
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华师本科生数据结构课件 第三章 堆排序与基数排序 本科生 数据结构 课件 第三 排序 基数排序
限制150内