【查找算法】顺序查找法

简介: 【查找算法】顺序查找法

学到这里,相信大家对基本的数据结构都有了一定的认识,当然,我们还有一些数据结构没有讲解,比如:图、广义表、数组等。这些内容我都会在后续进行更新。

不过这段时间,我主要还是先介绍一下查找和排序算法,在这些算法中如果涉及到还未介绍的数据结构,我就会对该数据结构进行介绍。

本篇文章将介绍顺序查找算法。

@[toc]

何为顺序查找?

看到这个算法的名字不难理解,它是一种按照序列原有顺序对数组进行遍历比较查询的基本查找算法。

该算法其实非常简单,大家肯定都会写,若是想查找一个序列中的某个元素值,我们只需遍历该序列,依次与序列中的每一个元素进行比较即可。

先来构造一个查找表:

#include <stdio.h>
#include <malloc.h>

#define LENGTH 10

typedef struct{
   
   
    int key;    //数据域
    //...还可以指定数据的其它信息
}ElemType;

typedef struct{
   
   
    ElemType *elem;
    int length;
}SSTable;

SSTable CreateTable(){
   
   
    SSTable st;
    st.length = LENGTH;
    st.elem = (ElemType*) malloc(sizeof(ElemType) * (LENGTH + 1));

    //为元素赋值
    st.elem[1].key = 1;
    st.elem[2].key = 2;
    st.elem[3].key = 3;
    st.elem[4].key = 4;
    st.elem[5].key = 5;
    st.elem[6].key = 6;
    st.elem[7].key = 7;
    st.elem[8].key = 8;
    st.elem[9].key = 9;
    st.elem[10].key = 10;

    return st;
}

数组的元素值我就直接写死了,大家也可以利用循环来自己输入。

对于初学者,这里的很多地方他们可能会有些疑惑,比如:为什么在申请内存的时候要多申请一个空间;在为数组赋值的时候为什么从下标为1的位置开始,这些我都放到后面解释。

先来看看查找算法的实现:

//顺序查找算法
int SequentialSearch(SSTable st,int key){
   
   
    int i;
    for(i = 1;i <= st.length;++i){
   
   
        if(st.elem[i].key == key){
   
   
            return i;
        }
    }
    return 0;
}

算法非常简单,遍历依次比较即可,若找到则直接返回当前下标;若没找到,则返回0。

算法改进

刚才虽然实现了顺序查找算法,但有些欠缺,因为每次循环都需要进行两次比较:比较下标是否越界;比较当前值是否等于待查找值。

当数据量非常庞大的时候,显然效率就比较低下了,那么有没有一种办法能够让它只比较一次就能够实现查找呢?这就是刚才为什么要多申请一个内存空间的原因了。

原数组中共有10个有效元素,但是在申请空间时要去申请11个内存空间,并且赋值要从下标为1的位置开始,目的就是空出下标为0的位置,如下图:
在这里插入图片描述
空出这个位置做什么呢?做一个监视哨,即:这个下标为0的位置要起一个哨兵的作用,举个例子:

我现在要查找值为8的元素,那么在查找开始之前,我先将元素值8放入下标为0的位置作为哨兵:
在这里插入图片描述
此时查找就很容易了,同样地,先遍历序列,但是无需比较下标是否越界了,我们直接让当前元素值与哨兵进行比较,若找到,则返回当前下标;
若当前序列中没有哨兵位置的元素值,则从下标为1开始到最后一个元素都将找不到待查找元素,此时一定会在哨兵位置找到,这个时候也直接返回当前下标即可,0则代表未找到。

带哨兵的顺序查找算法实现如下:

//带哨兵的顺序查找算法
int SequentialSearch(SSTable st,int key){
   
   
    int i;
    //设置哨兵
    st.elem[0].key = key;
    for(i = st.length;st.elem[i].key != key;--i);
    return i;
}

记得从数组最后一个元素开始遍历,这样如果在哨兵位置遍历结束,就证明查找失败。

时间效率分析

下面来分析一下带哨兵的顺序查找算法的时间效率。

在这里插入图片描述
若要在该序列中查找值为10的元素,则只需进行一次比较就查找到了;
若要在该序列中查找值为9的元素,则需进行两次比较才能找到,以此类推。

查找次数是受查找的值影响的,若要查找第i个元素,则需比较length + 1 - i次;查找失败则需比较length + 1次。

假设表中各记录的查找概率相同,则其查找的平均查找长度为:
$$ASL_s = (1 + 2 + ... + length) / length = (n + 1) / 2$$
则其时间复杂度为O(n)。

顺序查找算法的优点是:

算法简单,逻辑次序无要求,且不同存储结构均适用

缺点:

平均查找长度太长,时间效率太低

相关文章
|
机器学习/深度学习 网络协议 vr&ar
proteus仿真软件中芯片的命名规则与封装方法(详细版)
proteus仿真软件中芯片的命名规则与封装方法(详细版)
2582 0
|
关系型数据库 MySQL 测试技术
mysql中删除数据的几种方法
在MySQL数据库中,删除数据是一个常见的操作,它允许从表中移除不再需要的数据。在执行删除操作时,需要谨慎,以免误删重要数据。
1854 3
|
9月前
|
人工智能 自然语言处理 算法
2025 全球 GEO 行业年度报告:商用元年・语义主权争夺与市场突围路径
GEO(生成式引擎优化)作为2025年商用元年核心技术,以AI语义答案争夺为核心,覆盖全球30+主流AI平台,助力企业提升获客转化2.8倍。中国市场规模达42亿元,领跑全球。即搜AI、边鱼科技等头部企业分别在跨境出海与中小微服务领域实现突破,推动流量入口从“网页曝光”迈向“AI答案引用”。合规化、标准化、轻量化成关键趋势,GEO正成为企业数字化转型新基建。
南京观海微电子----CMOS门电路(OD门、传输门、双向模拟开关、三态门)
本文介绍了MOS管与CMOS电路的基本原理及特性,涵盖CMOS结构、拉电流与灌电流、输入噪声容限、动态特性、扇出系数等内容,并详细解析了OD门、传输门、三态门等特殊CMOS门电路的功能与应用,最后总结了CMOS电路的命名规则与主要优点。
南京观海微电子----CMOS门电路(OD门、传输门、双向模拟开关、三态门)
|
9月前
|
人工智能 JSON 自然语言处理
面向多模态AI平台的品牌内容曝光:从“被动收录”到“主动引用”的GEO工程化实践
作为资深数字营销工程师与AI开发者,我近期深耕生成式引擎优化(GEO)领域,推动品牌从“流量竞争”转向“认知竞争”。依托结构化数据、多平台适配与双引擎协同(GEO特工队AI+内容特工队AI),构建AI友好型内容生态,实现品牌在豆包、千问等主流平台的高效曝光与权威引用,打造可持续的GEO长跑战略。
1092 0
|
安全 数据安全/隐私保护 Windows
乱删文件,电脑不能开机,怎么办
很多朋友在清理电脑时误删系统文件,导致黑屏、蓝屏、无限重启等问题。本文详解误删关键文件后的修复方法,包括安全模式修复、系统恢复工具、命令提示符修复引导、系统还原及重装系统等方案,帮助你应对电脑无法开机的困境。
|
SQL 监控 JavaScript
MSSQL · 最佳实践 · SQL Server备份策略
在上一期月报中我们分享了SQL Server三种常见的备份技术及工作方式,本期月报将分享如何充分利用三者的优点来制定SQL Server数据库的备份和还原策略以达到数据库快速灾难恢复能力。 上期月报:MSSQL · 最佳实践 · SQL Server三种常见备份
2018 0
|
分布式计算 Hadoop
Hadoop修改Hadoop配置文件
【4月更文挑战第18天】修改Hadoop配置文件步骤:1) 查找安装目录,如`/usr/local/hadoop`或`/opt/hadoop`;2) 进入`conf`或`etc/hadoop`;3) 编辑主要配置文件如`core-site.xml`, `hdfs-site.xml`, `mapred-site.xml`, `yarn-site.xml`;4) 根据需求修改配置项,如改默认文件系统为`hdfs://localhost:9000/`;5) 保存并退出。注意:修改前备份,确保配置正确,重启Hadoop集群使更改生效。
1178 4
Hadoop修改Hadoop配置文件
|
开发工具 git
git统计项目代码行数
git统计项目代码行数 显示项目的所有文件列表及行数
2059 0
|
JavaScript 前端开发 数据安全/隐私保护
UI 框架:Element-plus组件库(一)
在现代Web开发中,用户界面的设计与交互体验至关重要。随着前端技术的迅速发展,各种UI框架层出不穷,旨在提升开发效率和用户体验。其中,Element Plus作为一款基于Vue 3的组件库,因其简洁优雅的设计和丰富的功能而备受欢迎。 Element Plus不仅提供了众多高质量的组件,还注重与开发者的友好互动,使得即使是初学者也能快速上手。在本系列文章中,我们将深入探讨Element Plus的各个组件及其应用,通过实例演示如何有效利用该框架构建美观且功能强大的用户界面。
1941 0

热门文章

最新文章