当前位置:文档之家› c语言数据结构查找算法大全.ppt

c语言数据结构查找算法大全.ppt


i--;
return (i); /*若i为0,表示查找失败,否则R[i]为要找的记录*/
}
※顺序查找算法性能分析:
在顺序查找中,比较次数ci取决于所查记录在表中的位置。如查找记录
R[n]时,仅需比较一次,而查找记录R[1]时,则需比较n次。一般来说,查找 第i个记录的比较次数为ci=n-i+1,因此,查找成功的平均查找长度为:
例 9-1
已知含有10个整数的查找表如下:(9,13,15,7,45,32,56,89,60, 36),从键盘上输入一个整数,用顺序查找的方法在查找表中查找该整数。若 存在,输出该元素的下标值,否则,给出相应的信息。
程序如下:
#include <stdio.h>
#define N 10
main()
low mid high (5) 取mid指示位置的关键字值26与给定值26作比较,显然是相等的,说 明查找成功。所查元素在查找表中的位置即为mid所指示的值。
查找关键字值为75的记录的过程:
8 12 26 37 45 56 64 72 81 89 95
low
mid
high
取mid位置的关键字值56与75作比较,显然75>56,说明要查找的记录在后
{ 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");
※顺序查找算法如下:
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]用来控制循环退出,起“监视哨”的作用*/
查找
9.1 基本概念
查找是指从一组记录集合中找出满足给定条件的记录。 查找表 在讨论查找时,通常假设被查找的对象是由一组 同一类型的记录构成的集合,称这个集合为查找表。 关键字 是指记录的某个数据项,用它可以标识一个记录。 若此关键字可以唯一地标识一个记录,则称此关键字为主关键 字;反之,把可以识别若干记录的关键字称为次关键字。 查找 是指根据某个给定的值,在查找表中查找一个其关 键字值等于给定值的记录。若表中存在这样的一个记录,则称 查找成功;若表中不存在关键字值等于给定值的记录,则称查 找失败。
查找表的C语言定义如下: #define N 100 int R[N+1]; /*使用的地址空间[1..N]*/
9.2.1 顺序查找
基本思想:从查找表的一端开始,逐个将记录的关 键字值和给定值进行比较,如果某个记录的关键字值和 给定值相等,则称查找成功;否则,说明查找表中不存 在关键字值为给定值的记录,则称查找失败。
半部分,待查区间变为[7,11] ,low=mid+1=6+1=7,求得mid=9。
low (1)
mid (6)
high (11)
取mid位置的关键字值56与26作比较,显然26<56,故要查找的26应
该在前半部分,所以下次的查找区间应变为[1,5],即low值不变仍为1,
high的值变为mid-1=5。求得mid=3。
8 12 26 37 45 56 64 72 81 89 95
的定义为:
ASL=
n
pi ci
i 1
其中,n为元素的个数; ci是查找第i 个记录需进行的
比较次数;pi是查找第i个记录的概率,一般可认为查找每
个记录的概率是相等的,即p1=p2=…=pn=1/n。
当ASL不易计算时,使用最大查找长度MSL来衡量算法。
9.2 静态查找表
——基于线性表的查找
此类查找主要有顺序查找、折半查找和索引顺序查找三种 方法。为简便起见,假设查找表中的记录为整型,记录的关 键字即为该整数,记录的个数为N,存放在数组R中。
n
n
ASL成功= pi×ci = pi×(n-i+1)
i 1
i 1
在等概率情况下,即pi=1/n时,查找成功的平均查找长度为(n+1)/2。
若关键字不在表中,则必须经过n+1次比较后才能确定查找失败。所以查找
失败的平均查找长度为n+1。这个结果表明:顺序查找的查找长度是与记录
的个数n成正比的。
结论:顺序查找的优点是算法简单,且对表的结构没有任何 要求。它的缺点是查找效率低,因此,当表中元素个数比较多时, 不宜采用顺序查找。

设有一个11个记录的有序表的关键字值如下:
8 12 26 37 45 56 64 72 81 89 95
假设指针low和high分别指示待查元素所在区间的下界和上界,指针
mid指示区间的中间位置。
查找关键字值为26的过程:
mid=(low+high)/2
8 12 26 37 45 56 64 72 81 89 95
else
printf("a[%d]=%d\n",p,x);
}
9.2.2 折半查找(二分查找)
使用折半查找必须具备两个前提条件:
(1)要求查找表中的记录按关键字有序(设,从小到大有序) (2)只能适用于顺序存储结构
基本思想:
先取查找表的中间位置的关键字值与给定关键字值作比较,若它们 的值相等,则查找成功;如果给定值比该记录的关键字值大,说明要查 找的记录一定在查找表的后半部分,则在查找表的后半部分继续使用折 半查找;若给定值比该记录的关键字值小,说明要查找的记录一定在查 找表的前半部分,则在查找表的前半部分继续使用折半查找。…直到查 找成功,或者直到确定查找表中没有待查找的记录为止,即查找失败。
查找技术分为: 1 静态查找表技术 顺序查找、折半查找、索引顺序查找 2 动态查找表技术 二叉查找树 3哈希表技术 哈希表技术
※查找算法的衡量指标
在查找一个记录时所做的主要操作是关键字的比较,
所以通常把查找过程中对关键字的平均比较次数作为衡量
一个查找算法效率优劣的标准,并称平均比较次数为平均
查找长度(Average Search Length)。平均查找长度
相关主题