第3章 查找与排序1.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文档。上传文档
查看更多
* * 第3章 查找与排序技术 3.1 基本的查找技术 3.2 哈希表技术 3.3 基本的排序技术 3.4 二叉排序树及其查找 查找是数据处理领域的一个重要内容, 查找的效率将直接影响到数据处理的 效率。所谓查找是指在一个给定的数 据结构中查找指定的元素。通常,根 据不同的数据结构应采用不同的查找 方法。 3.1 基本的查找技术 3.1 基本的查找技术 3.1.1. 顺序查找 3.1.2. 有序表的对分查找 3.1.3. 分块查找 3.1.1. 顺序查找 顺序查找是指在线性表中查找指定的元素,其基本方法为:从线性表的第一个 元素开始,依次将线性表中的数据元素 与被查元素进行比较,若相等则表示找 到;如果线性表中所有的元素都与被查 找元素进行了比较但都不相等,则查找 失败,即表中没有要找的元素。 e a w c b m p g 顺序查找数据元素 k 1 2 3 4 5 6 7 8 k=1; while(k=n)andV(k)!=x) k++; int search(ET V[],int n,ET x){ } return k; if(k==n+1) k=-1; 在线性表V中查找 其元素等于给定值 x的数据元素,若 找到,则返回其在 V中的下标,否则 返回-1。 b h 顺序查找缺点:对于大的线性表来说效率低。  顺序查找优点:算法简单而且适用面广,适用于: (1)线性表为无序表时 (2)有序表采用链式存储结构时。  在头指针为head的线性链表中顺序查找元素x,函数返回被查找元素x所在结点的存储地址。 node* lsearch (node* head, ET x ){ c e b d 0 head k 顺序查找数据元素b return k; k=k-next; while(k!=NULLk-data!=x) node k=head; } 3.1.2. 有序表的对分查找 有序表的对分查找只适用于顺序存 储的有序表,即线性表中的元素按 值非递减排列。  7 9 12 15 17 19 24 low high mid 28 30 34 36 5 2 3 4 5 6 7 8 9 10 11 12 13 2 1 查找元素 int bsearch(ET v[],int n,ET x){ low=1;high=n; while(low=high){ mid=(low+high)/2; if(v[mid]==x) return mid; if(v[mid]x) low=mid+1; else high=mid-1; } return -1; } 24 25 3.1.3. 分块查找 分块查找又称索引顺序查找,用于在分块有序表中进行查找。 分块有序表 13 8 9 20 33 42 44 38 24 46 60 12 22 58 74 47 86 53 分块有序表是将线性表分成子表,要求后 一个子表的元素大于前一个子表的元素。 分块有序表的结构分为两部分 (1)线性表本身采用顺序存储结构 (2)建立一个索引表。为每个子表建立一个索引结点: key k 存放子表中的最大值 子表中第一个元素在线性表中的位序 分块有序表 13 8 9 20 33 42 44 38 24 46 60 12 22 58 74 47 86 53 索引表 22 1 46 7 86 13 在分块有序表查找元素的过程: (1) 首先可利用对分查找在索引表中确定被查元素所在的子表。 (2) 再用顺序查找法在相应子表中进行查找。 最大值 起始位序 struct indnode{ ET key; int k; }; 1 6 7 12 13 18 13 8 9 20 33 42 44 38 24 46 60 12 22 58 74 47 86 53 22 1 46 7 86 13 查找元素 38 low high mid 1 6 7 12 13 18 i=s[high].k; struct indnode{ ET key; int k; }; j=s[high+1].k-1; 47 if(high!=m) 8 if((low!=high)(xs[low].key)) i j indnode s[m]; if(high!=mxs[low].key) i=1; j=n; else j=s[high].k-1; int insearch(ET v[],int m,int n,ET x,indnode s[]){ //分块有序表v,长度为n,索引表数组s的结点数m,查找x low=1;high=m; while(high-1low){//对分查找索引表 mid=(low+high)/2; if(x=s[mid].key

文档评论(0)

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

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

1亿VIP精品文档

相关文档