顺序查找又叫线性查找,是最基本的查找技术。
它的查找过程是:
从表中第一个或(最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。
代码实现如下:
int Sequential_search1(int *arr, int size, int key)
{
int i=0;
while(i<size)/*在指定范围内查找*/
{
if(arr[i]==key)/*若查询到,则返回所在关键字的下标*/
return i;
i++;
}
return -1;/*若返回-1,则说明查询失败*/
}
这段代码非常简单,就是在数组arr中查看有没有与关键字key相等的数,当你需要查找复杂表结构的记录时,只需要把数组arr与关键字key定义成你需要的表结构和数据类型即可
优化:
因为上述代码在每次循环时,都需要对i是否越界,即i是否小于size进行判断,这样略显多余。
我们可以设置一个哨兵,优化这种多次比较问题
代码如下:
/*优化版(有哨兵的顺序查找)*/
int Sequential_search2(int *arr, int size, int key)
{
arr[0] = key;/*设置arr[0]为关键字值,我们称之为哨兵*/
int i = size;/*循环从所查找范围尾部开始遍历*/
while(arr[i] != key)
i--;
return i;/*返回0则说明查找失败*/
}
此时代码是从尾部开始查找,由于arr[0]=key,
也就是说,如果在a[i]中有key则返回i值,查找成功。否则一定在最终的a[0]处等于key,此时返回的是0,即说明a[i]~~a[size]中没有关键字key,查找失败。
这种在查找方向的尽头放置“哨兵”免去了在查找过程中每一次比较后都要判断查找位置是否越界的小技巧,看似差别不大,但在总数据较多时,效率提高很大,是非常好的编码技巧。当然,“哨兵”也不一定就一定要在数组开始,也可以在数组末端等、
前提条件是定义数组时定义长度加一,为哨兵预留内存,这种算法适合有哨兵的数组列表,总的来说各有用处