第_10章 内部排序.pptVIP

  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文档。上传文档
查看更多
第十章 内部排序 10.1 概述 10.2 插入排序 10.3 交换排序 10.4 选择排序 10.5 归并排序 10.6 基数排序 排序(sort):将一组数据元素任意的序列,重新排列成一组按关键字有序的序列。 稳定与不稳定:一种排序方法,如果排序后具有相同关键字的记录仍维持排序之前的相对次序,则称之为稳定的,否则称为不稳定的。 例如: 排序前:49,38,65,97,76,13,27,49’ 排序后: 13,27,38,49,49’,65,76,97 该排序是 稳定的 13,27,38, 49’ , 49,65,76,97 该排序是不稳定的 内部排序:待排序的数据若存储在内存中,在内存中加以处理的,这种排序方法叫内部排序。 外部排序:如果在排序过程中,数据的主要部分存放在外存储器中(如软盘、硬盘、磁带),借助内存进行内、外存数据交换,逐步排列记录之间的顺序,则称之为外部排序。 内部排序可分五类:插入排序、交换排序、选择排序、归并排序和计数(分配)排序。 1)地址连续的一组存储单元(顺序存储),排序时需移动记录 2)静态链表,排序时不需移动记录,仅需修改指针 3)记录存放在地址连续的一组存储单元中,再设一组地址向量,排序时不需移动记录,结束后再调整记录的存储位置。 待排记录的数据类型 (以第一种方式讨论) #define MAXSIZE 20 typedef int KeyType ; typedef struct { KeyType key; InfoType otherinfo; }RedType; typedef struct { RedType r[MAXSIZE+1]; //r[0]闲置或作岗哨 int length; }SqList; 10.2 插入排序 10.2.1 直接插入排序 直接插入排序:将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增一的有序表。 void Insertsort(Sqlist L) { for (i=2;i=L.length;++i) if (LT(L.r[i].key,L.r[i-1].key)) //需将L.r[i-1]插入到有序子表 { L.r[0]=L.r[i]; //将L.r[i]复制到岗哨 L.r[i]=L.r[i-1]; for(j=i-2; LT(L.r[0].key,L.r[j].key); --j ) L.r[j+1]=L.r[j]; //记录后移 L.r[j+1]=L.r[0]; //插入到正确位置 } } 时间复杂度? 1. 折半插入排序 上述插入排序的基本操作是在一个有序表中进行查找和插入,查找可以用折半查找来实现,称之为折半插入排序。 void BInsertsort(Sqlist L) { for (i=2;i=L.length;++i) { L.r[0]=L.r[i]; low=1; high=i-1; while (low=high) { m=(low+high)/2; if (LT(L.r[0].key,L.r[m].key)) high=m-1; else low=m+1; } for(j=i-1; j=high+1;--j ) L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0]; } } 折半插入排序仅减少了关键字的比较次数,而没有减少移动次数。时间复杂度仍为O( n2 ) 2路插入排序是在折半插入排序的基础上再改进之,其目的是减少排序过程中记录的移动次数,但需要n个记录的辅助空间。 具体方法:另设一个和L.r同类型的数组d,首先将L.r[1]赋值给d[1],并将d[1]看成是在排好序的序列中处于中间位置的记录,然后从L.r中第二个记录起依次插入到d[1]之前或之后的有序序列中。先将待插记录的关键字和d[1]的关键字进行比较,若L.r[i

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档