- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构实例教程(C语言版) 第9章排序的分析与应用 学习目标 了解排序的定义。 熟练掌握各种排序方法的基本思想及实现方法。 掌握各种排序方法时间复杂度和稳定性的分析方法。 掌握各种排序方法在何种情况下使用的分析方法。 9.1排序的基本概念 一、排序的定义 1、排序的定义:假设含n个记录的序列为{ R1, R2, …,Rn }, 按照关键字的递增(或递减),记录将形成新的序列为 { Rp1, Rp2, …,Rpn }。 2、举例 关键字:12,45,9,23,90,77,65 调整为:9,12,23,45,65,77,90 学号 姓名 成绩王菲 90周董 87飞儿 77石头 90刘欢 95 可以按学号或者成绩进行排序 9.1排序的基本概念 二、相关概念 1、内部排序:若整个排序过程不需要访问外存便能完成。 2、外部排序:若内存无法容纳全部数据,排序需要借助外 部存储设备才能完成。 3、稳定排序和不稳定排序 假设Ki=Kj(1≤i≤n,1≤j≤n,i≠j),若在排序前的序列中 Ri领先于Rj(即ij),经过排序后得到的序列中Ri仍领先于Rj,则排序方法是稳定的;反之,是不稳定的。 排序前的序列为:(56, 34, 47, 23, 66, 18, 82, 47) 若排序后结果为:(18, 23, 34, 47,47, 56, 66, 82),则称该排序方法是稳定的。 若排序后结果为:(18, 23, 34,47,47, 56, 66, 82),则称该排序方法是不稳定的。 9.2插入排序 一、直接插入排序 1、排序过程描述 ①首先将待排序记录序列中的第一个记录作为一个有序段。 ②从第2个记录起到最后一个记录,依次和前面子序列中的 记录比较,确定插入的位置。 9.2插入排序 一、直接插入排序 2、举例:对序列{32,15,6,48,19,15,49}进行直接插 入排序。 9.2插入排序 一、直接插入排序 3、直接插入排序算法如下: void inerSort(LineList R[ ],int n) { int i,j; for(i=2;i=n;++i) if(R[i].keyR[i-1].key) { R[0].key=R[i].key; for (j=i-1;R[0].keyR[j].key;--j) R[j+1]=R[j]; R[j+1]=R[0]; } } 9.2插入排序 二、希尔排序 1、排序过程描述 ①取定一个正整数d1n,把d1作为间隔值,把全部记录从 第一个记录起进行分组,所有距离为d1倍数的记录放在 一组中,在各组内进行直接插入排序。 ②取定一个正整数d2d1,重复上述分组和排序工作,直至取di=1为止,即所有记录在一个组中进行直接插入排序。 ③希尔提出的方法是:d1= ,di+1= 9.2插入排序 二、希尔排序 2、举例:对序列{25,36,12,68,45,16,37,22 }进行希 尔排序。 9.2插入排序 二、希尔排序 3、希尔排序算法如下: void shellSort(LineList R[ ],int n) { int i,j,d; d=n/2;//初始步长为表长的一半 while(d0)//直到d为1 { for(i=d+1;i=n;++i)//对每组进行直接插入排序 if(R[i].keyR[i-d].key) { R[0].key=R[i].key; for(j=i-d;j0R[0].keyR[j].key;j=j-d) R[j+d]=R[j]; R[j+d]=R[0]; } d=d/2;//缩小步长值 } } 9.3交换排序 一、冒泡排序 1、排序过程描述 ①将整个记录序列划分成有序区和无序区。初始状态有序区 为空,无序区包括所有待排序的记录。 ②对无序区从前向后依次将相邻记录的关键字进行比较,若 逆序将其交换,值小的记录向左移,值大的记录向右移。 ③每经过一趟冒泡排序,无序区中关键字值最大的记录进入
文档评论(0)