chap2-DS课件-3.ppt

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
chap2-DS课件-3.ppt

基本概念 设含有n个记录的文件{R1,R2,…Rn},其相应的关键字为{K1,K2,…Kn},需确定一种排列P(1),P(2)…P(n)使其相应的关键字满足递增(或递减)关系: KP(1)≤KP(2)≤…KP(n) 或KP(1)≥KP(2)≥…KP(n) 使上述文件成为一个按其关键字线性有序的文件{RP(1),RP(2) ,…RP(n)},这种运算就称为排序 内排序 指当文件的数据量不太大时,全部信息放在内存中处理的排序方法。当文件的数据量较大时,排序过程中需要在内外存之间不断地进行数据交换才能达到排序的目的,这种排序称为外排序 一、插入排序 基本思想是:每步将一个待排序的记录,按关键码值的大小插入到前面已排序的适当位置上,直到全部插完为止。 1. 直接插入排序 在排好的序列中用顺序法查找插入位置,找到后将它后面的所有记录后移一个位置,再插入新记录。 排序n个记录的文件,关键码比较次数为n2量级,记录移动个数也为n2量级。 基本思想是: 把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。 把a[i]插入到a[0],a[1],...,a[i-1]之中的具体实施过程为:先把a[i]赋值给变量t,然后将t依次与a[i-1],a[i-2],...进行比较,将比temp大的元素右移一个位置,直到发现某个j(0=j=i-1),使得a[j]=t或j为(-1),把t赋值给a[j+1]。 哨兵的作用 算法中引进的附加记录R[0]称监视哨或哨兵。 哨兵有两个作用: ① 进人查找(插入位置)循环之前,它保存了R[i]的副本,使不致于因记录后移而丢失R[i]的内容; ② 它的主要作用是:在查找循环中“监视”下标变量j是否越界。一旦越界(即j=0),因为R[0]和自己比较,循环判定条件不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界(即省略了循环判定条件“j=1”)。 注意: ① 实际上,一切为简化边界条件而引入的附加结点(元素)均可称为哨兵。 ② 引入哨兵后使得测试查找循环条件的时间大约减少了一半,所以对于记录数较大的文件节约的时间就相当可观。对于类似于排序这样使用频率非常高的算法,要尽可能地减少其运行时间。所以不能把上述算法中的哨兵视为雕虫小技,而应该深刻理解并掌握这种技巧。 2. 二分法(折半)插入排序 在已排好序的序列中使用二分法查找插入位置,找到后移动其后记录插入新记录。关键字比较次数降为nlog2n量级,记录移动个数仍为n2量级。 void BinInsertSort (ElemType r[], int n) { ElemType temp; int i, j, low, hight, m; for (i=1; in; i++) {// r[0]已经有序,从r[1]开始 if (r[i].keyr[i-1].key) { // 准备插入 low = 0; high = i-1; while (low=high) { //折半查找法,寻找插入位置 m=(low+high)/2; if (r[m].keyr[i].key) high=m-1; //取左区间 if (r[m].keyr[i].key) low=m+1; if (r[m].key=r[i].key) { high=m; break; } } //while 结束, r[i]应该插在 high+1的位置上 temp=r[i]; // 保存r[i], 同时留出移动的空间 j=i-1; while (j=high+1) { r[j+1]=r[j]; j--; }; // 移动数据 r[high+1]=temp; // 插入 } // if } //

文档评论(0)

资料 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档