顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不相等时,则表中没有所查的记录,查找不成功。
顺序查找的算法如下:
/*顺序查找,a为待查数组,n为数组长度, key为要查找的关键字*/
int search(int* a, int n, int key)
{
for (int i = 0 ; i < n; ++i)
{
if (a[i] == key)
{
return i;
}
}
return -1;
}
代码非常简单,就是在数组中循环遍历查找,但是上述算法每次循环时都要判断变量i是否越界,比较麻烦,事实上我们还可以优化下上述代码,为此,我们可以设置一个哨兵来避免每次都要进行越界检查,改进后的算法代码如下:
/*顺序查找,a为待查数组,n为数组长度, key为要查找的关键字*/
int search(int* a, int n, int key)
{
a[0] = key; //设置a[0]为关键字值,再次做哨兵
int i = n;
while (a[i] != key)
{
i--;
}
return i;
}
上述代码在查找方向的尽头放置哨兵免去了在查找过程中每次都要判断越界的问题,看似差距不大,但是赛总数据较多时,效率提高会非常明显,是非常好的编程技巧,但是前提是要对数组元素进行构造,或者使用STL容器。
对于这种顺序查找表来说,查找最好的情况就是第一个位置就找到了,算法时间复杂度为O(1),最坏的情况是在最后一个位置找到,需要比较n次,时间复杂度为O(n),当查找不成功时需要比较n+1次,时间复杂度为O(n),基于任意位置的查找概率是相同的,所以平均查找次数为(n+1)/2,所以最终时间复杂度仍为O(n)。
显然,当n较大时,顺序查找算法效率将极为低下,不过优点是算法简单,对于一些小型数据还是适用的,实际开发中,我们也通常将一些常用的记录放在顺序表前面,不常使用的放在表后面,以此来提高查找效率。