据结构第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 概述 2 插入排序(直接插入排序、希尔排序) 3直接选择排序 4交换排序(起泡排序、快速排序) 5归并排序 6内部排序方法的比较 习题 1 概述 基本概念 定义:将文件中的数据记录按关键字值的递增或递减的顺序排列起来。 {R1, R2,..., Rn}? {Ri1, Ri2,..., Rin} 其中关键字{k1, k2,..., kn}? 有序序列{ki1, ki2,..., kin} 排序方法的稳定性: 对于ki=kj的记录Ri=Rj( Ri在Rj之前), 排序后: Ri仍在Rj之前,则排序方法是稳定的; Ri在Rj之后, 则排序方法是不稳定的; 基本概念 方法分类: 内部排序:在内存中进行,适于小文件 外部排序:使用内存和外存,适于大文件,内存不够用 内部排序:文件可有三种存储结构 (1)一维数组:对记录的物理位置重排 (2)链表:修改指针 (3)索引表:对索引进行物理重排,记录位置不动(由于不方便移动等原因) 本章仅考虑:记录数组R[n],关键字key为整数 标准: 执行时间(最重要的标志),所需空间,算法复杂度 排序的时间代价主要指:算法中关键字的比较次数和记录的 移动次数 2 插入排序 3 选择排序(Select Sort) 4 交换排序 4.1 起泡排序(Bubble method) 基本思想: 任取待排序记录序列中的某个记录 (例如取第一个记录) 作为枢轴(pivot),以该记录的关键字作为基准,将整个记录序列划分为左右两个子序列: 左侧子序列中所有记录的关键字都小于或等于枢轴记录的关键字 右侧子序列中所有记录的关键字都大于枢轴记录的关键字 枢轴记录则排在这两个子序列中间(这也是该记录最终应安放的位置)。 然后分别对这两个子序列重复施行上述方法,直到所有的记录都按关键字有序排在相应位置上为止。 快速排序算法 采用快速排序方法对n个记录排序,只须调用QuickSort(R,1,n),即可完成对R[1..n]的排序。快速排序算法如下: void QUICKSORT(rectype R[ ],int s1,int t1); //对R[s1]到R[t1]做快速排序 { int i; if (s1t1) // 只有一个记录或无记录时无须排序 { i=PARTITION(R,s1,t1); // 对R[s1]到R[t1]做划分,i作为枢轴的位置 QUICKSORT(R,s1,i?1); // 递归处理左区间 QUICKSORT(R,i+1,t1); // 递归处理右区间 } } 快速排序算法须调用划分算法对无序区按基准进行划分。划分算法如下: int PARTITION(rectype R[ ],int l,int h) //对无序区R[1..h]做划分,返回划分后被定位的基准记录(枢轴)的位置 { int i,j; rectype temp;i=l;j=h;temp=R[i]; //初始化,temp为基准 do{ //从右向左扫描,查找第一个关键字小于temp.key的记录 while((R[j].key=temp.key)(ij)) j??; if(ij) R[i++]=R[j]; //交换R[i]和R[j] while((R[i].key=temp.key)(ij)) i++; // 从左向右扫描,查找第一个关键字大于temp.key的记录 if(ij) R[j??]=R[i]; //交换R[i]和R[j] }while(i!=j); R[i]=temp; // 基准temp已被最后定位 return i; } 第一次划分的过程 各趟排序之后的状态 5 归并排序(Merge Sort) 算法思想 假设初始表含有n个记录,则可看成是n个有序的子表,每个子表的长度为1,然后两两归并,得到?n/2?个长度为2或1的有序子表,再两两归并,……,如此重复,直至得到一个长度为n的有序子表为止。 这种方法称为“二路归并排序” 归并的过程 将两个有序子表合并为一个有序子表的过程类似于玩扑克牌:假设桌上有两堆面朝上的牌,最小的排在上面,现要将这两堆牌(看作输入)合并成一堆有序的牌(看作输出)。基本步骤是比较两输入堆顶上的两张牌,取出较小的那张牌将

文档评论(0)

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

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

1亿VIP精品文档

相关文档