第10节 内部排序.pptVIP

  1. 1、本文档共63页,可阅读全部内容。
  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文档。上传文档
查看更多
Chapter10 排序 6.1基本概念 排序 排序在计算机程序设计中有着非常重要的地位,许多具体应用要求对数据进行排序,而许多复杂的算法也要求以排序为基础。 排序 排序:将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。 数据表(datalist): 它是待排序数据对象的有限集合。 主关键字(key): 数据对象有多个属性域, 即多个数据成员组成, 其中有一个属性域可用来区分对象, 作为排序依据,称为关键字。也称为排序码。 排序 有关排序的几个基本问题 稳定与不稳定 内部排序与外部排序(本章只关注内部排序) 性能的衡量 排序方法的分类 按照排序思想 插入排序 交换排序 选择排序 归并排序 基数排序 按照时间复杂度 简单排序 先进排序 其他 6.2 直接插入排序 直接插入排序 基本思想:如果要向一个已经排序的顺序表中插入元素且保持表的有序性,则只需先依次比较,找到该元素的位置,然后移动元素进行插入即可。时间复杂度是O(n). 基于这一思想,如果要对一个表进行排序,则可以将表看作两个部分,前N个元素已经排好序,再将第N+1个元素插入到前N个元素中。从N=0开始重复这个过程,直到N=L。 直接插入排序 直接插入排序 直接插入排序 直接插入排序的算法 typedef int SortData; void InsertSort ( SortData V[ ], int n ) { //按非递减顺序对表进行排序 SortData temp; int i, j; for ( i = 1; i n; i++ ) { temp = V[i]; for ( j = i; j 0; j-- ) //从后向前顺序比较 if ( temp V[j-1] ) V[j] = V[j-1]; else break; V[j] = temp; } } 直接插入排序 时间复杂度为O(n^2) 折半插入排序 可见,插入排序由“查找”和“移动”两个基本过程组成,而查找这一步骤实际上是在一个有序表中进行的,因此可以用折半查找代替顺序查找来提高效率。 但是由于移动这一过程无法被简化,因此折半插入排序仍然保值O(n^2)的时间复杂度。 链表上的插入排序 链表上的插入排序仍然无法回避比较的过程,但是无需移动元素,从总体上看比顺序表上插入排序的性能好一些。 6.3 起泡排序 起泡排序 基本思想:基于两两比较的思想,对于N个元素,如果从第一个开始两两比较,将较小(较大)的一个交换到后面,则经过N-1次比较之后,最小(最大)的元素就被移动到最后一个位置。 基于这一思想,如果要对一个表进行排序,则可以先对全部元素进行两两比较,将最小(最大)的元素移动到最后,再对前N-1元素重复过程,再对前N-2个……直到所有的元素都排好序。 起泡排序 起泡排序 起泡排序的基本算法 typedef int SortData; void BubbleSort ( SortData a[ ], int n ) { for(int i=0;in;i++){ for(int j=0;jn-i-1;j++) { if(a[j] a[j+1]) { int temp = 0; temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } } 起泡排序 最多做n-1趟起泡就能把所有对象排好序。 在对象的初始排列已经按排序码从小到大排好序时,此算法只执行一趟起泡,做n-1次排序码比较,不移动对象。这是最好的情形。 时间复杂度是O(n^2)。 起泡排序 起泡排序的改进:在上面的程序中,如果序列经过很少几次循环就已经完成了排序,程序仍然会执行N-1次循环,造成多次循环做无用功。 例如对于下面的序列,实际上经过一次循环就已经有序了。 起泡排序 对于这种情况,我们可以设置一个标志,如果一次循环发生数据交换,则令标志为1;如果一次循环不发生数据交换,则令标志为0,当发现标志为0时,就意味着已经排序完成了。 起泡排序 typedef int SortData; void BubbleSort ( SortData V[ ], int n ) { int i = 1; int exchange = 1; while ( i n exchange ){ exchange = 0; //标志置为0,假定未交换 for ( int j = n-1; j = i; j-- )

文档评论(0)

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

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

1亿VIP精品文档

相关文档