[理学]计算机软件技术基础 第6章 查找和排序.ppt

[理学]计算机软件技术基础 第6章 查找和排序.ppt

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

查找和排序 自动化与电气工程学院 沈捷 查找基本概念 查找表: 由同一类数据构成的用于查找的集合被称作查找表。查找表是具有一定存储结构的数据集合,比如顺序表结构、链式结构、树形结构等。 查找往往根据数据元素的某个属性进行。例如根据学号查找某个学生记录。这种被用于查找的元素属性一般称为关键字,它往往可以唯一标识一个元素。 给定一个值K,在含有n个记录的文件中进行有哪些信誉好的足球投注网站,寻找一个关键字等于K的记录,如找到则成功,否则查找失败。 静态查找表: 查找表一旦建立,在以后的查找过程中就不会改变。它所对应的查找算法属于静态查找技术。 动态查找表:查找表建立后,在后来的查找过程中仍会改变查找表的内容。它所对应的查找算法属于动态查找技术。 动态查找的例子——词汇统计问题。就是统计一篇文章中使用了多少词汇以及每个词汇的使用次数。 解决方法是先建立一个空的查找表,以后每读到一个词就在查找表中查询一下,如果该词汇存在则将其使用次数加一,否则将新词插入到查找表中并设使用次数为一次。显然,这个查找表是不断扩张的。 静态查找技术 假设静态顺序查找表的存储结构为: struct SSTable{ ElemType *data; //存储空间地址 int length; //表的长度 }; 顺序查找表的元素存放在data[0]至data[length-1]中。 1 顺序查找 顺序查找的方法是从表的一端开始,逐一比较给定的数据key和表中数据元素的关键字x的值,若两个数据一致则查找成功,同时给出该数据元素在表中的位置,否则查找失败。 ElemType data[length]; int length; int SqSearch(ElemType data[length], KeyType key) { int k = 0; while(klengthdata[k]!=key) k++; if (klength) return k; //返回数据元素位置 else return 0; } 该算法若查找成功,则函数返回值为目标元素在表中的位置,否则返回0。这里元素位置从1开始算起。 在上述算法中为了避免“出界”,需在循环中作klength 的判断,这使算法的执行时间几乎增加一倍。为提高效率,对查找表的结构改动如下: 适当设置数组长度,将元素存于data[0]至data[length-1]中,在length号单元预存待查找数据key作为监视哨。改写查找过程为从后往前查找。 因为循环查找过程至少会在length号单元停止,这样就不必在每一次循环中都判别是否数组出界。 int SqSearch(data[length+1], KeyType key) { data[length+1] = key; //监视哨 int k = 0; while(data[k]!=key) k++; if (klength+1) return k; //返回数据元素位置 else return 0; } 该算法若查找成功,则函数返回值为目标元素在表中的位置,否则返回0。 2 对分查找(折半或二分) 顺序查找表的查找算法简单,但平均查找长度较大。如果顺序查找表的元素按照关键字的值有序存放,那么可利用高效的对分查找来完成查询。 假定元素按关键字的值升序排列,折半查找的思路是将给定的数据与有序表中间位置的元素做比较,若两者相等则查找成功;若前者小于后者则在中间位置左边的元素中继续查找;若前者大于后者则在中间位置右边的元素中继续查找。不断重复这一过程直到查找成功,或者直到查找区间缩小为一个元素时却仍未找到目标,则查找失败。 int BinSearch( data[length-1], KeyType key ) { int low, high, mid; low = 0; high = length-1; //设置查找区间初值 while (low = high) { mid = (low + high) / 2; if(key==data[mid]) return mid+1; //查找成功 else if( keydata[mid] ) high = mid-1; //继续在前半区间进行查找 else low = mid + 1; //继续在后半区间进行查找 } return 0;

文档评论(0)

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

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

1亿VIP精品文档

相关文档