1
算法与数据结构  C语言版
1.11.2.1 9.2.1 顺序查找
9.2.1 顺序查找

以顺序表或线性链表表示静态查找表,则Search函数可用顺序查找来实现。本节中只讨论它在顺序存储结构模块中的实现。

下面讨论顺序查找的实现。

顺序查找(sequential search)的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。此查找过程可用算法9.1描述。

算法9.1 顺序查找

该算法在查找之前先对ST.elme[0]的关键字赋值key,目的在于免去查找过程中每一步都要检测整个表是否查找完毕。因此,ST.elme[0]起到了监视哨的作用。这种设置监视哨的改进算法能使顺序查找在ST.length≥1000时,进行一次查找所需平均时间几乎减少一半。

查找算法中的基本操作是将记录的关键字和给定值进行比较,通常以“其关键字和给定值进行过比较的记录个数的平均值”作为衡量依据。对于n个数据元素的查找表,若给定值k与表中第i个元素关键码相等,即定位第i个记录时,需进行n-i+1次关键码比较,即ci=n-i+1。故成功的平均查找长度为

等概率情况下,pi=1/n(1≤i≤n),则ASL=(n+…+2+1)/n=(n+1)/2。即查找成功时的平均比较次数约为表长的一半。

若k值不在表中,则须进行n+1次比较之后才能确定查找失败。

有时,表中各个记录的查找概率并不相等。例如,将全校学生的病历档案建立一张表放在计算机中,则体弱多病同学的病历记录的查找概率必定高于健康同学的病历记录。

因此,为了提高查找效率,查找表中的数据存放需依据查找概率越高,其比较次数越少,查找概率越低,比较次数就较多的原则。

顺序查找的优点:算法简单,且对表的结构无任何要求,无论是用数组还是用链表来存放结点,也无论结点之间是否按关键字有序,它都同样适用。

顺序查找的缺点:查找效率低,因此当n较大时不宜采用顺序查找。