顺序查找(线性表的查找)

顺序查找

  • 顺序查找(Sequential Search)的查找过程为:从表的一端开始,依次将记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功;反之,若扫描整个表后,仍未找到关键字和给定值相等的记录,则查找失败。
  • 顺序查找方法既适用于线性表的顺序存储结构,又适用于线性表的链式存储结构。下面只介绍以顺序表作为存储结构时实现的顺序查找算法。
  • 数据元素类型定义如下:
typedef struct
{
    KeyType key;        //关键字域
    InfoType otherinfo; //其他域
} ElemType;
顺序表的定义同第2章:
typedef struct
{
    ElemType *R; //存储空间基地址
    int length;  //当前长度
} SSTable;

在此定义下,顺序查找算法便与第 2 章的算法 2.2 一样。在此假设元素从 ST.R[1] 开始顺序向后存放,ST.R[0]闲置不用,查找时从表的最后开始比较,如算法 7.1 所示。
- 算法 7.1 顺序查找
【算法描述】

// 算法 7.1
int Search_Seq(SSTable ST, KeyType key)
{ //在顺序表 ST中顺序查找其关键字等千key的数据元素。若找到 , 则函数值为该元素在表中的位置,否则为0
    for (i = ST.length; i >= l; --i)
        if (ST.R[i].key == key)         //从后往前找
            return i;
    return 0;
}

算法 7.1 在查找过程中每步都要检测整个表是否查找完毕,即每步都要有循环变量是否满足条件 i >= 1 的检测。改进这个程序,可以免去这个检测过程。改进方法是查找之前先对 ST.R[O] 的关键字赋值 key,在此,ST.R[O]起到了监视哨的作用,如算法 7.2 所示。
- 算法 7.2 设置监视哨的顺序查找
【算法描述】

// 算法 7.2
int Search_Seq(SSTable ST, KeyType key)
{                      //在顺序表 ST 中顺序查找其关键字等于 key 的数据元素。若找到,则函数值为该元素在表中的位置,否则为 0
    ST.R[O].key = key; //"哨兵"
    for (i = ST.length; ST.R[i].key != key; --i)
        ; //从后往前找
    return i;
}

【算法分析】

  • 因此,算法 7.2 仅是一个程序设计技巧上的改进 ,即通过设置监视哨, 免去查找过程中每一步都要检测整个表是否查找完毕。然而实践证明,这个改进能使顺序查找在ST.length >= 1000 时,进行一次查找所需的平均时间几乎减少一 半。当然,监视哨也可设在高下处。
  • 算法 7.2 和算法 7.1 的时间复杂度一样, 在第 2 章已经做过分析,即
    在这里插入图片描述
  • 算法 7.2 的时间复杂度为 O(n)。
  • 顺序查找的优点是:算法简单,对表结构无任何要求,既适用于 顺序结构,也适用千链式结构,无论记录是否按关键字有序均可应用。其缺点是:平均查找长度较大,查找效率较低,所以当 n 很大时,不宜采用顺序查找。

加油各位!本人自学笔记,如有侵权及时删除(希望能帮到大家,谢谢)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值