查找算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
再取mid位置的关键字值81与75作比较,显然75<81,说明待查记录在前半 部分。待查区间再次变为 [7,8],high=mid-1=9-1=8,求得mid=7。 8 12 26 37 45 56 64 72 81 89 95 low, mid high 此时75>64,low=mid+1=8,待查区间变为[8,8] ,求得mid=8。 8 12 26 37 45 56 64 72 81 89 95
查 找
9.1 基本概念
查找是指从一组记录集合中找出满足给定条件的记录。
查找表 在讨论查找时,通常假设被查找的对象是由一组 同一类型的记录构成的集合,称这个集合为查找表。
关键字 是指记录的某个数据项,用它可以标识一个记录。 若此关键字可以唯一地标识一个记录,则称此关键字为主关键 字;反之,把可以识别若干记录的关键字称为次关键字。 查找 是指根据某个给定的值,在查找表中查找一个其 关键字值等于给定值的记录。若表中存在这样的一个记录,则 称查找成功;若表中不存在关键字值等于给定值的记录,则称 查找失败。
基本思想:从查找表的一端开始,逐个将记录的关
键字值和给定值进行比较,如果某个记录的关键字值和 给定值相等,则称查找成功;否则,说明查找表中不存 在关键字值为给定值的记录,则称查找失败。
※顺序查找算法如下:
int seqsearch (int R[],int k) /*元素存放在R的1-N处源自文库/ /*在查找表R中查找关键字为k的记录,查找成功,返回记录在R中的下 标值,否则返回0*/ { int i; R[0] =k; /*将k放入R[0]中*/ i=N; /*从最后一个元素开始查找*/ while (R[i]!=k) /*R[0]用来控制循环退出,起“监视哨”的作用*/ i--; return (i); /*若i为0,表示查找失败,否则R[i]为要找的记录*/ }
设有一个11个记录的有序表的关键字值如下: 8 12 26 37 45 56 64 72 81 89 95 假设指针low和high分别指示待查元素所在区间的下界和上界,指针 mid指示区间的中间位置。 mid=(low+high)/2 查找关键字值为26的过程: 8 12 26 37 45 56 64 72 81 89 95 low (1) mid (6) high (11)
查找关键字值为75的记录的过程:
8 12 26 37 45 56 64 72 low mid 81 89 95 high
取mid位置的关键字值56与75作比较,显然75>56,说明要查找的记录在后 半部分,待查区间变为[7,11] ,low=mid+1=6+1=7,求得mid=9。 8 12 26 37 45 56 64 72 81 89 95 low mid high
例
取mid位置的关键字值56与26作比较,显然26<56,故要查找的26应 该在前半部分,所以下次的查找区间应变为[1,5],即low值不变仍为1, high的值变为mid-1=5。求得mid=3。 8 12 26 37 45 56 64 72 low mid high (5) 81 89 95
取mid指示位置的关键字值26与给定值26作比较,显然是相等的,说 明查找成功。所查元素在查找表中的位置即为mid所指示的值。
例
已知含有10个整数的查找表如下:(9,13,15,7,45,32,56,89,60, 36),从键盘上输入一个整数,用顺序查找的方法在查找表中查找该整数。若 存在,输出该元素的下标值,否则,给出相应的信息。
程序如下:
#include <stdio.h> #define N 10 main() { int x ,p ; int a[N+1]={0,9,13,15,7,45,32,56,89,60,36}; scanf("%d",&x); p=seqsearch (a, x); /*调用顺序查找算法*/ if(p==0) printf("This number does not exist in this array.\n"); else printf("a[%d]=%d\n",p,x); }
2 折半查找(二分查找)
使用折半查找必须具备两个前提条件:
(1)要求查找表中的记录按关键字有序(设,从小到大有序) (2)只能适用于顺序存储结构
基本思想:
先取查找表的中间位置的关键字值与给定关键字值作比较,若它们 的值相等,则查找成功;如果给定值比该记录的关键字值大,说明要查 找的记录一定在查找表的后半部分,则在查找表的后半部分继续使用折 半查找;若给定值比该记录的关键字值小,说明要查找的记录一定在查 找表的前半部分,则在查找表的前半部分继续使用折半查找。…直到查 找成功,或者直到确定查找表中没有待查找的记录为止,即查找失败。
low,mid,high 显然75>72,待查区间变为low=mid+1=9,high=8,此时high<low,说明查 找表中没有关键字值为75的记录,查找失败。
※折半查找算法:
int binsearch (int R[],int k) { int low,high,mid,find=0; low=1; high=n; /*置区间初值*/ while ((low<=high)&& (!find)) { mid=(low+high)/2; /*求区间中间位置*/ if (k==R[mid]) find=1; /*查找到*/ else if (k>R[mid]) low=mid+1; /*在后半区查找,修改low*/ else high=mid-1; /*在前半区查找,修改high*/ } if (find) return (mid); /*查找成功,返回找到的元素位置*/ else return (-1); /*查找失败,返回-1*/ }
静态查找表
——基于线性表的查找
此类查找主要有顺序查找、折半查找和索引顺序查找三
种方法。为简便起见,假设查找表中的记录为整型,记录的 关键字即为该整数,记录的个数为N,存放在数组R中。
查找表的C语言定义如下:
#define N 100
int R[N+1];
/*使用的地址空间[1..N]*/
1 顺序查找