顺序查找法的特点是,用所给关键字与线性表中各元素的关键字逐个比较,直到成功或失败。存储结构通常为顺序结构,也可为链式结构。
顺序结构数据类型的定义:
#define LIST_SIZE 20
typedef struct {
KeyType key;
OtherType other_data;
} RecordType;
typedef struct {
RecordType r[LIST_SIZE+1];
int length;
} RecordList;
在表的一端设置一个称为“监视哨”的附加单元,存放要查找元素的关键字。从表的另一端开始查找,如果在“监视哨”找到要查找元素的关键字,返回失败信息,否则返回相应下标。
int SeqSearch(RecordList l, KeyType k)
{
l.r[0].key = k;
i = l.length;
while (l.r[i].key != k)
i--;
return(i);
}
用平均查找长度(ASL)分析顺序查找算法的性能。假设列表长度为 n,那么查找第 i个数据元素时需进行 n-i+1 次比较,即 Ci=n-i+1。又假设查找每个数据元素的概率相等,即 Pi=1/n,则顺序查找算法的平均查找长度为:
为便于比较,下面给出不用“监视哨”的算法
int SeqSearch(RecordList l, KeyType k)
{
i = l.length;
while (i >= 1 && l.r[i].key != k)
i--;
if (i >= 1)
return (i) else return (0);
}
算法 2 与算法 1 相比,循环控制条件中增加了 i>=1,用以判断查找过程是否越界。加 上“监视哨”可省去这个条件,从而提高查找效率。
折半查找法又称为二分查找法,这种方法对待查找的列表有两个要求:
(1)必须采用顺序存储结构;(2)必须按关键字大小有序排列。
首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
否则利用中间位置记录将表分成前、后两个子表。
如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
下图给出了用折半查找法查找 12、50 的具体过程,其中 mid=(low+high)/2,当 high<low 时,表示不存在这样的子表空间,查找失败
int BinSrch (RecordList l, KeyType k)
{
low = 1;
high = l.length;
while (low <= high) {
mid = (low + high) / 2;
if (k == l.r[mid].key)
return(mid);
else if (k < l.r[mid].key)
high = mid - 1;
else
low = mid + 1;
}
return (0);
}
ppt里 略