顺序查找算法及其优化

文章介绍了顺序查找的基本实现,包括原始版本和带有哨兵的优化版本。优化后的顺序查找通过在数组末尾放置哨兵,减少了不必要的边界检查,提高了查找效率。尽管时间复杂度仍为O(n),但对小型数据和特定数据分布有优势。
摘要由CSDN通过智能技术生成

顺序查找的算法实现如下。

/*  顺序查找,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]为关键字值,我们称之为“哨兵”  */
a[0]  =  key;        
/*  循环从数组尾部开始  */
i  =  n;                
while  (a[i]  !=  key)
{i--;}
/*  返回0则说明查找失败  */
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很大时,查找效率极为低下,不过优点也是有的,这个算法非常简单,对静态查找表的记录没有任何要求,在一些小型数据的查找时,是可以适用的。
另外,也正由于查找概率的不同,我们完全可以将容易查找到的记录放在前面,而不常用的记录放置在后面,效率就可以有大幅提高。
 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值