基本思想
从顺序表的一端开始扫描,将给定值K依次与顺序表中各数据元素的关键字进行比较,若当前扫描到的结点关键字与给定值K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。
实例分析
在顺序表:22,34,25,12,35,67,7,45中查找25的位置。在数组元素的1~8位置中依次存放组成顺序表的数据元素,将给定值K作为新数据元素的数据项存放在0位置(称其为监视哨)。查找操作从顺序表的最后一个元素开始,依次将r[8]~r[1]的关键字依次与给定值K比较。最后输出位置i,若i>0时,表示查找成功,i=0时表示查找失败。
分析图如下:
代码实现
int SeqSearch(List L,int key)
{
L.r[0]=key;
int i=L.length;
while(L.r[i]!=key)--i;
return i;
}
注意,将r[0]置为key的好处是,防止下标越界,节省重新比较的时间。
性能分析
假设顺序表的长度为n,那么查找第i个元素时需要进行n+1-i次比较,即Ci=n+1-i。又假设查找每个数据元素的概率相等,则Pi=1/n,则顺序查找算法的平均查找长度为:
注:平均查找长度中Pi为查找顺序表中第i个元素的概率,Ci为找到关键字等于给定值K时已经进行比较过的次数。
由上可知,最大查找长度和平均长度与的算法时间复杂度均为O(n)。