排序基本概念.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文档。上传文档
查看更多
第9章 排 序 ;9.1 排序基本概念 ; 按待排序的记录的数量多少,排序过程中涉及的存储介质不同,排序方法分为两大类:内部排序和外部排序。内部排序是指待排序的记录存放在计算机内存之中;外部排序是指待排序的记录数量很大,以至于内存容纳不下而存放在外存储器之中,排序过程需要访问外存。本章主要讨论内部排序。外部排序在10.4节讨论。 排序的依据可以是记录的主关键字,也可以是次关键字,甚至是若干数据项的组合。为了讨论方便把排序所依据的数据项统称排序关键字,简??关键字。假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn},所谓排序就是将记录按关键字非递减(或非递增)的顺序重新排列起来。 ; 在待排序的记录中若有多个相同的关键字,在用某种方法排序之后,这些关键字相同的记录相对先后次序不变,则称这种排序方法是稳定的;否则是不稳定的。本章所介绍的内部排序方法包括插入排序、交换排序、选择排序、归并排序和基数排序。前四类排序是通过比较关键字的大小决定记录先后次序,也称为比较排序。基数排序是不经关键字比较的排序方法。 ; 为了讨论方便,在此把排序关键字假设为整型。记录的结构定义: typedef struct /*记录结构*/ {int key; /*排序关键字域*/ int oth; /*其他域,根据需要自己设定*/ }node; 进行排序的向量结构如下: node r[MAXSIZE] 其中MAXSIZE是一常量,应该足够大。若记录总数为n,则MAXSIZEn。在本章各排序方法中,约定第一个记录存放在r[1]之中。 ;9.2 插 入 排 序 ; 例 设有一组关键字序列{55,22,44,11,33},这里n=5,即有5个记录。如图9.1所示。请将其按由小到大的顺序排序。 ; 在具体实现Ki 向前边插入时,有两种方法。一种方法是让Ki 与K1,K2,…顺序比较;另一方法是Ki 与Ki-1 ,Ki-2,… 倒着比较。这里选用后一种方法。 用一维数组r做存储结构,n表示记录个数。则算法如下: ;算法 void stinsort ( node r[?], int n) {for (i=2; i=n; i++) /*共进行n-1趟插入*/ {r[0]=r[i]; /*r[0]为监视哨,也可做下边循环结束标志*/ j=i-1; while (r[j].key r[0].key) {r[j+1]=r[j];j--;} r[j+1]=r[0]; /*将r[0]即原r[i]记录内容,插到r[j]后一位置*/ } }/*sinsort*/ ; 此算法外循环n-1次,在一般情况下内循环平均比较次数的数量级为O(n),所以算法总时间复杂度为O(n2)。由于比较过程中,当Kj 与K0 相等时并不移动记录,因此直接插入排序方法是稳定的。 直接插入排序也可用单链表做存储结构,当某结点i的关键字Ki 与前边有序表比较时,显然先与K1 比较,再与K2 比较……即从链表表头结点开始向后逐一比较更合适。另外,直接插入排序在原关键字序列基本有序或n值较小时,它是一种最常用的排序方法,它的时间复杂度接近于O(n)。但是,当待排序的关键字无序、n值又较大时,此方法就不再适用。 ;9.2.2 折半插入排序 当直接插入排序进行到某一趟时,对于r[i].key来讲,前边i-1个记录已经按关键字有序。此时不用直接插入排序的方法,而改为折半查找,找出r[i].key应插的位置,然后插入。这种方法就是折半插入排序(binary insertion sort)。算法如下: 算法 void binasort(node r[?], int n) { for (i=2; i=n; i++) { r[0]=r[i]; l=1; h=i-1; whil (l=h) ; { mid= (l+h)/2; if(r[0].keyr[mid].key) h=mid-1; else l=mid+1; } for(j=i-1; j=l; j--) r[j+1]=r[j]; r[l]=r[0]; } }/*binasort*/ ;9.2.3 希尔排序

文档评论(0)

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

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

1亿VIP精品文档

相关文档