【问题】顺序查找( sequential search )是指在查找集合中依次查找值为 的元素,若查找成功,则给出该元素在查找集合中的位置;若查找失败,则给出失败信息。
【想法】为了避免在查找过程中每一次比较前都要判断查找位置是否越界,可以设置观察哨( sentinel ),即将待查值放在查找方向的“尽头”处,则比较位置 至多移动到下标 0 处。查找过程如图所示。
【算法分析】算法SeqSearch的基本语句是 r [ i ] ! = k,设 表示查找第
个元素的概率,等概率情况下,基本语句的执行次数为:
顺序查找算法和其改进算法的时间复杂性都是 O(n),而系数相差一倍。实验表明,改进算法在表长大于1000时,进行次顺序查找的时间几乎减少一半。
【算法实现】顺序查找算法用JAVA语言描述如下:
public class SequentialSearch {
static int SeqSearch1(int r[], int n, int k) //数组r[1] ~ r[n]存放查找集合
{
int i = n;
while (i > 0 && r[i] != k) //检测比较位置是否越界
i--;
return i;
}
static int SeqSearch2(int r[], int n, int k) //数组r[1] ~ r[n]存放查找集合
{
int i = n; //从数组高端开始找
r[0] = k; //设置哨兵
while (r[i] != k) //不用检测比较位置是否越界
i--;
return i;
}
public static void main(String args[]){
int r[]= {0,1,5,3,9,4};
int k1 = SeqSearch1(r,5,3);
int k2 = SeqSearch2(r,5,3);
System.out.println(k1);
System.out.println(k2);
}
}
运行结果如下:
from:算法设计与分析(第2版)——王红梅 胡明 编著——清华大学出版社