改进的堆排序算法和其复杂度分析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
改进的堆排序算法和其复杂度分析.doc

改进的堆排序算法及其复杂度分析 张玉林 1.推排序算法简介 排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列重新排列成一个按关键字有序的序列。假设含n个记录的序列为{R1,R2,…,Rn}(1) 其相应的关键字序列为{K1,K2,…,Kn},需确定1,2,…,n的一种排序P1,P2,…,Pn,使其相应关键字满足如下的非递减(或非递增)的关系 KP1≤KP2≤…≤KPn (2) 即使公式(1)的序列成为一个按关键字有序的序列RP1,RP2,…,RPn (3) 这样的一种操作称为排序。其中关键字Ki可以是记录Ri(i=1,2,…,n)的主关键字,也可以是记录Ri的次关键字,甚至是若干数据项的组合。 排序算法有:插入排序,合并排序,冒泡排序,选择排序,希尔排序,堆排序,快速排序,计数排序,基数排序等,各个算法的时间和空间复杂度也不同。而对n个关键字K1,K2,…,Kn进行堆排序的算法是威洛姆斯(WilliomsJ)在1964年提出的。堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占一个存储空间。原始的推排序算法只有n*log(n)的时间复杂度,其思想是利用堆这种数据结构,堆可以看成一个完全二叉树,所以在排序中比较的次数可以做到很少。加上其是原地排序,不需要申请额外的空间,效率也不错。 定义1:n个元素的序列{K1,K2,…,Kn}当且仅当满足下列关系时,称之为堆:Ki≤K2i,Ki≤K2i+1或Ki≥K2i,Ki≥K2i+1,其中i=1,2,…, 对深度为h的堆,筛选算法中进行的关键字比较次数至多为2(h-1)次,则在建立含n个元素、深度为h的堆时,总共进行的关键字比较次数不超过4n。而n个结点的完全二叉树的深度为[log2n]+1,则调整建新堆时调用Heapadjust过程n-1次, 总共进行的比较次数为 由此,在最坏的情况下,堆排序的时间复杂度为 理论上已经证明任何一种比较排序算法在最坏的情况下所需做的键比较次数至少是 故堆排序算法的任何改进已不可能降低数量级,而只能设法降低复杂度因子。因此,对算法的改进应从降低 t ( n)开始。 2.推排序改进思想及程序 从堆的特性可以看出, 在 K1 , K2 , …, Kn 是基本有序时, 尾结点在从堆底逆序上升至堆顶后往往又被筛回到底层附近,而每下筛一层需进行2 次键比较,这使得重新建堆的算法往往运行在最坏情况下。为了减少重新建堆过程中的键比较次数,设计先从根开始, 每次只通过一次键比较使最大的子结点上升一层,在进行至第 d 次之后,通过将尾结点键值和当前结点的父结点键值作比较,决定尾结点是上升还是下筛。如果仍需下筛,则再通过d次键比较使当前结点下降 d 层,然后再判定尾结点是要上升还是下筛。这样一直做下去,可知最坏情况是降至底层后再上升 d 层,所以每次重新建堆至多作( h + [ h/ d ]+ d)次键比较。设K1,K2,…,Kn存于数组k [1 ]至k [ n ]中,则改进后的算法可描述为: 建立初始堆 buildheap () {for ( i = n/2 ; i =1 ; i -- ) shift ( i , n) ;}   / 3 buildheap3/ shift (int i , int n)   / 3将 k[ i ]~k[ n ]整理成堆3/ { x = k [ i ] ; j = 23 i ; while ( j = n) {if ( j n k [ j ] k [ j + 1 ]) ++ j ; if ( x = k [ j ]) break ; k [ i ]= k [ j ] ; i = j ; j = 23 i ;} k [ i ]= x ;}   / 3shift3 重新建堆 rebuild (int x ;int n ;intdeep) { i = 1 ; j =23 i ; d =0 ; while ( j = n) { d = d + 1 ; if ( j n k [ j ] k [ j +1 ]) ++ j ; if ( d = deep) { d = 0 ; if ( x = k [ j ]) break ;}   k [ i ]= k [ j ] ; i = j ; j = 23 i ;} while ( i 1 x k [ n/2 ])   { k [ i ]= k [ n/ 2 ] ; i = n/ 2 ;} k [ i ]= x ;}   / 3rebuild3/ 在堆深 h ≤[log2 n]时(此时堆中的元素一般说来已基本有序) ,重新建堆实际上变成先通过h 次比较降至堆底,然后再适当上升将尾结点放在正确的位置。 heapsort ()

文档评论(0)

feiyang66 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档