概念
顺序查找又叫线性查找,是最基本的查找技术,他的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找失败。
顺序表查找算法
//a为数组,n为要查找的数组个数,key为要查找的关键字
int Sequential_Search(int *a,int n,int key)
{
int i;
for(i=1;i<=n;i++)
{
if (a[i]==key)
return i;
}
return 0;
}
上面的代码非常简单,就是在数组a(注意元素值从下标1开始)中查找有没有关键字key,当你需要查找复杂表结构的记录时,只需要把数组a与关键字key定义成你需要的表架构和数据类型即可。
顺序表查找优化
其实上面的代码并非足够完美,因为每次循环时都需要对i是否越界,即是否小于等于n做判断。那么,我们可以设置一个哨兵,可以解决不需要每次让i与n作比较。
/* 有哨兵顺序查找 */
int Sequential_Search2(int *a,int n,int key)
{
int i;
a[0]=key; //设置哨兵
i=n; //循环从数组尾部开始
while(a[i]!=key)
{
i--;
}
return i;
}
上述代码是从尾部开始查找的,由于a[0]=key ,也就是说,如果在a[i]中有key,则返回i值,查找成功。否则一定在最终的a[0]处等于key,此时返回的是0,即说明a[1]~a[n]中没有关键字key,查找失败。
这种在查找方向的尽头设置哨兵,免去了在查找过程中每一次比较后都要判断查找位置是否越界的小技巧,看似与原先的差别不大,但是如果总数据比较多时,效率提升很大。
总结
对于顺序表查找来说,查找成功最好的情况就是在第一个位置就找到了,算法时间复杂度为O(1),最坏的情况就是在最后一个位置才找到,需要n次比价,时间复杂度为O(n),当查找不成功时,需要n+1次比较,时间复杂度为O(n),平均查找次数为(n+1)/2,所以最终的时间复杂度还是O(n)。
很明显,顺序查找技术是有很大缺点的,n很大时,查找的效率极其低下,不过优点也是有的,这个算法非常简单,对静态查找表的记录没有任何要求,在一些小型数据的查找时,是可以适用的。