第8单元 内部排序.pptVIP

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

8.4.2 堆排序 3.性能分析 (1)时间性能分析 堆排序的主要时间耗费在建初始堆和调整堆上。对n个记录的待排序列建立深度为k的堆,已知 ,则: 建初始堆,总共进行的关键字比较不超过4n次,所以建堆的时间复杂度为O(n)。 在筛选算法中,从根到叶子的筛选,关键码比较次数至多为2(k-1)次,交换记录至多k次。调整、建新堆时调用heapadjust过程n-1次,因此,总的比较次数不超过: 所以,堆排序的总时间代价为O(n)+O(nlog2n)= O(nlog2n)。理论上,堆排序最好、最差、平均情况下的时间复杂度为O(nlog2n)。 8.4.2 堆排序 3.性能分析 (2)空间性能分析 堆排序仅在交换堆顶元素和堆底元素时使用了一个临时单元r[0],其空间复杂度S(n)=O(1)。 (3)稳定性 在调整过程中,完全二叉树的父子结点之间的移动不能保证两个关键码相同的记录一定保持原始输入顺序。例如图9.8中,算法的执行改变了65和65’的原始顺序。 8.5 归并排序 归并排序是利用“归并”技术来进行排序,所谓“归并”是指将若干个已排序的子序列合并成一个有序序列。归并排序通常分为2-路归并和多路归并,2-路归并一般用于内部排序,多路归并一般用在外部磁盘数据排序中。本节主要介绍2-路归并排序。 8.5归并排序 1.基本思路 2-路归并排序的过程很简单,首先是将原始序列划分成两个子序列,再分别对这两个子序列进行归并排序。因此,2-路归并排序是一个递归的过程,它主要包含两个操作:划分序列和将两个有序表合并为一个有序表。 2-路归并排序除了递归描述外,还可以采用迭代的描述方式,基本思路如下:首先将初始序列中的n个记录看成n个有序的子序列,每个子序列长度为1;两两合并,得到?n/2?个长度为2或1的有序子序列;再两两合并,……,如此重复,直至得到一个长度为n的有序序列。 8.5归并排序 1.基本思路 2-路归并排序的过程很简单,首先是将原始序列划分成两个子序列,再分别对这两个子序列进行归并排序。因此,2-路归并排序是一个递归的过程,它主要包含两个操作:划分序列和将两个有序表合并为一个有序表。 2-路归并排序除了递归描述外,还可以采用迭代的描述方式,基本思路如下:首先将初始序列中的n个记录看成n个有序的子序列,每个子序列长度为1;两两合并,得到?n/2?个长度为2或1的有序子序列;再两两合并,……,如此重复,直至得到一个长度为n的有序序列。 8.5归并排序 2.归并排序算法 2-路归并排序不论采用递归方式还是迭代方式实现,排序中的基本操作都是将两个有序表合并成一个有序表。 设r[s..t]由两个有序子表r[s..m] 和r[m+1..t]组成,两个有序子表合并成一个有序表r1[s..t]。该算法在第2章中详细介绍,具体如下: 8.5归并排序 2.归并排序算法 void merge( Rectype r[],Rectype r1[],int s,int m,int t) { i=s;j=m+1;k=s; while(i=mj=t) if(r[i].keyr[j].key) r1[k++]=r[i++]; else r1[k++]=r[j++]; while(i=m) r1[k++]=r[i++]; while(j=t) r1[k++]=r[j++]; } 8.5归并排序 2.归并排序算法 (1) 2-路归并排序递归算法 void msort(Rectype r[],Rectype r1[],int s,int t) /*将r[s..t]归并排序为r1[s..t]*/ { int m; if(s==t) r1[s]=r[s]; else { m=(s+t)/2; /*将r分成两部分*/ msort(r,r1,s,m); /*递归地将r[s..m]归并为有序的r1[s..m]*/ msort(r,r1,m+1,t); /*递归地将r[m+1..t]归并为有序的r1[m+1..t]*/ merge(r1,r,s,m,t); /*将r1[s..m]和r1[m+1..t]合并为r1[s..t]*/ } } void binarymergesort(Rectype r[],int n) /*对序列r[1..n]归并排序为r1[1..n]*/ { msort(r,1,n); } 8.5归并排序 2.归并排序算法 (2) 2-路归并排序迭代算法

文档评论(0)

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

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

1亿VIP精品文档

相关文档