3.查找算法:顺序查找和二分查找

news2024/9/20 15:00:58

查找

查找,是指在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程。

列表查找(线性表查找):从列表中查找指定元素

输入:列表,待查找元素

输出:元素下标(未查找到元素时返回-1)

顺序查找(线性查找)

  1. 顺序查找(linear search)

也叫线性查找(linear search),从列表的第一个元素开始,顺序的进行查找,直到找到元素或搜索到列表的最后一个元素为止。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ARR_SIZE 10

int linear_search(const int *arr, const int n, const int val)
{
    for (int i = 0; i < n; i++)
    {
        if (arr[i] == val)
            return i;
    }

    return -1;
}

int main(int argc, char *argv[])
{
    srand(time(NULL));

    int arr[ARR_SIZE] = {0};
    printf("arr = "); 
    for (int i = 0; i < ARR_SIZE; i++)
    {
        arr[i] = rand()%10 + 1;
        printf("%d ", arr[i]);
    }
    printf("\n");

    int val = rand()%10 + 1;
    printf("search val = %d\n", val);
    int index = linear_search(arr, ARR_SIZE, val);
    printf("index = %d\n", index);

    return 0;
}

结果:

  1. 时间复杂度:O(n)

顺序查找算法最差的情况,需要循环n次,所以该算法的时间复杂度为O(n)

二分查找法

  1. 二分查找法(binary)

又叫折半查找,从有序的列表初始选区[0 n-1]开始,即下标left = 0,right = n - 1,通过待查找的值与候选区中间(即下标为mid)的值继续比较。可以使候选区减少一半。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ARR_SIZE 10

int binary_search(const int *arr, const int n, const int val)
{
    int left = 0;
    int right = n-1;
    int mid;

    while (left <= right)
    {
        mid = (left + right)/2;

        if (arr[mid] == val)  
            return mid;
        else if (arr[mid] > val) //候选区在left
            right = mid - 1;
        else //候选区在right
            left = mid + 1;

    }

    return -1;
}

int main(int argc, char *argv[])
{
    srand(time(NULL));

    int arr[ARR_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    printf("arr = "); 
    for (int i = 0; i < ARR_SIZE; i++)
        printf("%d ", arr[i]);
    printf("\n");

    int val = rand()%10 + 1;
    printf("search val = %d\n", val);
    int index = binary_search(arr, ARR_SIZE, val);
    printf("index = %d\n", index);

    return 0;
}

结果:

  1. 时间复杂度:,或logn

二分查找算法,每次执行可以使候选区减少一半,所以时间复杂度为:或logn

顺序查找和二分查找比较

通过以上分析,顺序查找的算法时间复杂度为:O(n),二分查找的算法时间复杂度为:

  1. 如果需要查找时,并且被查找的列表有序,那么选择二分查找,执行效率会比顺序查找快很多。

  1. 如果需要查找时,被查找的列表无序,就选择顺序查找。但是,如果需要频繁查找时,我们可以选择先对被查找的列表进行排序,然后在选择二分查找,从而提高查找的效率。

ending😃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程 随便起的

进程&#xff1a;进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体&#xff0c;每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构如果想让-一个进程访问另一个进程的资源&#xff0c;需要使用进程间通信&#xff0c;比如管道&#xff…

LAMP项目部署实战1

一、说明&#xff1a; LAMP&#xff1a;Linux Apache MySQL PHP Apache&#xff1a; Apache是世界使用排名第一的Web服务器软件。主要用于接收用户的请求&#xff0c;处理业务逻辑&#xff0c;返回结果给客户端&#xff08;浏览器&#xff09;。 PHP&#xff1a;一种专门…

SQL 层功能改进 - lookupJoin 的优化

一、传统 join 算法lookupJoin 是 join 查询的一种&#xff0c;传统 join 算法为&#xff1a;1. 遍历 A 表&#xff0c;读取一条数据 r2. 遍历 B 表&#xff0c;对于每条数据&#xff0c;与 r 进行 join 操作3. 重复 1、2 操作&#xff0c;直到 A 表遍历完所有数据二、lookupJo…

在 WIndows 下安装 Apache Tinkerpop (Gremlin)

一、安装 JDK 首先安装 Java JDK&#xff0c;这个去官网下载即可&#xff0c;我下载安装的 JDK19&#xff08;jdk-19_windows-x64_bin.msi&#xff09;&#xff0c;细节不赘述。 二、去 Tinkerpop 网站下载 Gremlin 网址&#xff1a;https://tinkerpop.apache.org/ 点击下面…

用cpolar发布本地的论坛网站 1

网页论坛向来是个很神奇的地方&#xff0c;曾经的天涯论坛和各种BBS&#xff0c;大家聚在在一起讨论某个问题&#xff0c;也能通过论坛发布想法&#xff0c;各种思维碰撞在一起&#xff0c;发生很多有趣的故事&#xff0c;也产生了很多流传一时的流行语录。当然&#xff0c;如果…

推荐5款免费无广告的精品软件

检查一下你最近安装的软件&#xff0c;他们是不是都一样无法避免最终被你打入冷宫的命运&#xff1f;我们明明很懂“在精不在多”的道理&#xff0c;却依然让我们的电脑塞满了形形色色无用的软件。你需要知道的是&#xff0c;如何找到一款适合自己且真正实用的电脑软件。 1.多…

元宇宙营业厅,数字技术融合,赋能实体经济

在我国数字经济与虚拟服务市场规模扩大下&#xff0c;元宇宙营业厅强势来袭&#xff0c;从多场景、多内容&#xff0c;深耕高效协同的特色功能&#xff0c;基于多元化、灵活的交互体验&#xff0c;更大程度上解决线上业务办理抽象繁琐&#xff0c;线下业务办理的时空受限、业务…

4.Spring【Java面试第三季】

4.Spring【Java面试第三季】前言推荐4.Spring27_Aop的题目说明要求Spring的AOP顺序AOP常用注解面试题28_spring4下的aop测试案例业务类新建一个切面类MyAspect并为切面类新增两个注解&#xff1a;spring4springboot1.5.9pom测试类29_spring4下的aop测试结果aop正常顺序异常顺序…

求极限方法总结

1.利用四则运算法则求极限 2.利用两个重要极限求极限 //0除以0型 //1的无穷次方型 3.利用等价无穷小替换替换求极限 //在等价替换时注意和差项 4.利用洛必达法则求极限 5.利用夹逼准则求极限 6.利用单调有界数列极限准则求极限 7.利用无穷小的性质求极限 8.利用函数的连续性…

来面试阿里测开工程师,HR问我未来3-5年规划,我给HR画个大饼。

在面试的过程中是不是经常被面试官问未来几年的职业规划?你会答吗&#xff1f;是不是经常脑袋里一片空白&#xff0c;未来规划&#xff1f;我只是想赚更多的钱啊&#xff0c;哈哈哈&#xff0c;今天我来教大家&#xff0c;如何给面试官画一个大饼&#xff0c;让他吃的不亦乐乎…

MySQL高级第二讲

目录 二、MySQL高级02 2.1 触发器 2.1.1 触发器介绍 2.1.2 创建触发器 2.2 MySQL的体系结构 2.3 存储引擎 2.3.1 存储引擎概述 2.3.2 各种存储引擎特性 2.3.3 InnoDB 2.3.4 MyISAM 2.3.5 MEMORY 2.3.6 MERGE 2.3.7 存储引擎的选择 2.4 优化sql 2.4.1 查看sql执行…

二分查找重复情况 找最左边或最右边的位置下标

目录二分找最左边二分找最右边综合应用(剑指offer)二分找最左边 核心思想: 先mid (lr)/2每次向左取整; 然后命中target的时候&#xff0c;右边界逼近到mid; 因为每次mid向左取整&#xff0c;mid命中target时l代替mid位置&#xff0c;则循环迭代最后会卡出重复数字最左侧的位置…

糖化学试剂55520-67-7,5-vinyl-2-deoxyuridine,5-乙烯基-2-脱氧尿苷特点分析说明

5-vinyl-2-deoxyuridine(5-VdU)&#xff0c;5-vinyl-2-deoxyuridine&#xff0c;5-Vinyldeoxyuridine5-乙烯基-2-脱氧尿苷 | CAS&#xff1a;55520-67-7 | 纯度&#xff1a;95%试剂信息&#xff1a;CAS&#xff1a;55520-67-7所属类别&#xff1a;糖化学分子量&#xff1a;C11H…

信息系统基本知识(一)

1.1 信息系统与信息化 信息论已发展成为一个内涵非常丰富的学科&#xff0c;与控制论和系统论并称为现代科学的“三论” 1.1.1 信息的基本概念 香农指出&#xff1a;信息是能够用来消除不确定性的东西。信息量的单位&#xff1a;比特 信息的特征 客观性&#xff1a;信息是…

四信塔式起重机监控系统应用方案

方案背景 塔式起重机是当前工业建设进行起重运输作业的重要设备&#xff0c;其设备性能、参数、技术指标的可靠性都关系起重机设备的危险&#xff0c;塔式起重机安全事故关系国计民生、危害面广&#xff0c;给国家财产和生命安全带来严重损失。 目前众多塔式起重机司机虽然有上…

界面开发(1) --- PyQt5环境配置

PyQt5环境配置 第一步&#xff1a;首先安装社区版Pycharm 下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionwindows 第二步&#xff1a;安装Anaconda3&#xff0c;配置虚拟环境 下载地址&#xff1a;https://www.anaconda.com/ 第三步&#xff1…

win10安装docker

1.win10安装docker&#xff0c;前提必须是要安装WSL2。 现在Docker Desktop默认使用WSL 2来运行&#xff0c;而不是以前的Hyper-V。 WSL2 全称是Windows Subsystem on Linux。意思是&#xff0c;在win10&#xff0c;可以直接启动一个Linux。因为docker依赖Linux内核。 可查看…

洛谷 U91193:棋盘覆盖问题 ← 分治法

【题目来源】https://www.luogu.com.cn/problem/U91193【问题描述】 在一个2^k * 2^k&#xff08;k≥0&#xff09;个方格组成的棋盘中&#xff0c;恰有一个方格与其他方格不同&#xff0c;称该方格为一特殊方格。现在用4种不同形状的 L型&#xff08;占3小格&#xff09;骨牌覆…

java 元数据 和 元注解

基本介绍三种基本注解OverrideDeprecatedSuppressWarnings四种元注解RetentionTargetDocumentedInherited一、基本介绍1.概述java注解&#xff08;Annotation&#xff09;[ˌ nəˈ teɪʃn]&#xff0c;又称java标注&#xff0c;也被称为元数据&#xff08;关于数据的数据&…

Kotlin学习:5.2、异步数据流 Flow

Flow一、Flow1、Flow是什么东西&#xff1f;2、实现功能3、特点4、冷流和热流5、流的连续性6、流的构建器7、流的上下文8、指定流所在协程9、流的取消9.1、超时取消9.2、主动取消9.3、密集型任务的取消10、背压和优化10.1、buffer 操作符10.2、 flowOn10.3、conflate 操作符10.…