- 顺序查找(对顺序表或者线性链表查找)
从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,反之,若至第一个记录,其关键字和给定值都不相等,则查找不成功
int search_seq(int *st, int n, int key)
{
int i;
st[0] = key; //免去了查找过程中每一步都检测整个表是否查找完毕
i = n;
while(st[i] != key)
{
i--;
}
return i;
}
平均查找长度:
ASL = (n+1)/2
缺点:平均查找长度较大,特别是当n很大时,查找效率很低
优点:算法简单,适应面广,对表结构无要求,无论记录是否有序都可以使用,线性链表同样适用。
折半查找(也称二分查找,对有序表的查找)
先确定待查记录所在的范围(区间),然后逐步缩小范围知道找到或找不到该记录为止。
二分查找的查找次数计算
例题:有一个有序表为{1,5,8,11,19,22,31,35,40,45,48,49,50},当二分查找值为48的结点时, 查找成功需要比较的次数( 4 )
一共13个数,将其分别标号为1~13:
low和high分别指向待查元素所在范围的下界和上界,mid指向区间的中间位置,
第一次比较:low=1,high=13,mid=7,31<48,未找到,注意:下一次比较时,low=mid+1 或者high = mid-1 因为mid已经比较过了,不符合,不需要做比较,下一次比较时,不再将其包含在比较区间内
第二次比较:low=mid+1=8,high=13,mid=10,45<48,未找到
第三次比较:low=mid+1=11,high=13,mid=12,49>48,未找到
第四次比较:low=11,high=mid-1=11,mid=11,48=48.找到,结束。
与顺序查找对比
折半查找的效率比顺序查找高,但折半查找只使用与有序表,且限于顺序存储结构(对线性链表无法有效地进行折半查找)。3.索引顺序查找(分块查找,对索引顺序表的查找)
这是顺序查找的一种改进方法,在该查找方法中,除了表本身外,还需建立一个“索引表”。索引表包括两项内容:关键字项(其值为该子表内的最大关键字)以及指针项(指示该子表的第一个记录在表中的位置)。
索引表按关键字有序,则表分块有序(分块有序指第二个子表中所有记录的关键字均大于第一个子表中的最大关键字,第三个子表中的所有记录均大于第二个子表中的最大关键字),子表中记录无序。
例如:
给定key=38,对索引表中确定块的查找可用顺序查找,亦可用折半查找,22<38<48,所找记录必定在第二个子表中,第二个子表起始位置为7,在块中记录无序,只能顺序查找。