二分查找算法的C语言实现以及复杂度分析

二分查找是一种在有序数组中查找特定元素的算法。其基本思想是通过不断地将数组分成两半并排除其中一半来缩小搜索范围。

二分查找算法的C语言实现
#include <stdio.h> // 二分查找函数
int binarySearch(int arr[], int l, int r, int x) 
{while (l <= r) // 当左边界不超过右边界时循环,begin和end是左闭右闭区间,因此有=号{  assert(arr);int mid = l + (r - l) / 2;  // 计算中间位置,防止溢出// 检查中间位置的元素是否是目标值if (arr[mid] == x) return mid;  // 找到目标,返回索引// 如果目标值小于中间元素,则只需在左半部分查找if (arr[mid] > x) r = mid - 1;  // 调整右边界elsel = mid + 1;  // 否则,调整左边界}return -1;  // 目标值不在数组中
}int main(void) {int arr[] = {2, 3, 4, 10, 40};  int n = sizeof(arr) / sizeof(arr[0]);  // 计算数组长度int x = 10;  // 设定要查找的值int result = binarySearch(arr, 0, n - 1, x);  // 调用二分查找函数// 输出结果if (result == -1)printf("元素不在数组中");elseprintf("元素在索引 %d 处", result);return 0;  
}

二分查找算法的时间复杂度主要取决于数组被分割的次数。在每一步中,搜索范围减少到原来的一半。因此,最坏情况下,算法的时间复杂度为 O(log n),其中 n 是数组的长度。

可以想象每次查找都把一张纸折了一半,纸折半了多少次就除了多少个2。除了多少个2就相当于找了多少次。假设折半查找了x次,2^x = N。x = log N (log以2为底,N的对数)。

最好的情况就是只分割了一次就刚好找到,所以是 O(1)
最坏的情况是找不到或者只剩一个 -- O(log2 N)

在迭代版本的二分查找中,空间复杂度为 O(1)。

以下是python的实现。

def binary_search(arr, l, r, x):if r >= l:mid = l + (r - l) // 2# 如果元素在中间if arr[mid] == x:return mid# 如果元素小于中间的元素,那么它只可能在左子数组中elif arr[mid] > x:return binary_search(arr, l, mid - 1, x)# 否则元素只可能在右子数组中else:return binary_search(arr, mid + 1, r, x)# 元素不在数组中else:return -1arr = [2, 3, 4, 10, 40]
x = 10# 函数调用
result = binary_search(arr, 0, len(arr) - 1, x)if result != -1:print(f"元素在索引 {result} 处")
else:print("元素不在数组中")

Python的实现与C语言版本非常相似,定义一个函数 binary_search,它接收一个列表、搜索范围的左右边界 lr,以及要查找的元素 x 。然后使用递归来不断缩小搜索范围。

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

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

相关文章

C++ std::string 类的 substr 函数

在 C 中&#xff0c;std::string 类的 substr 函数用于从字符串中提取一个子字符串。这个函数非常实用&#xff0c;常用于字符串处理任务。以下是 substr 函数的基本用法和细节&#xff1a; 函数原型 substr 函数的原型如下&#xff1a; string substr(size_t pos 0, size_…

贝斯手-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;贝斯手 作者&#xff1a;Tokeii 提示&#xff1a;无 解题附件&#xff1a; 解题思路&信息收集&#xff1a; 详细信息看了&#xff0c;没有藏料&#xff0c;这次上来就是一个命好名的压缩包浅浅打开一下&…

组合总和(回溯)

题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 样例输入 示例 1: 输入: k 3, n 7 …

9.整数转换为布尔值【2023.12.1】

1.问题描述 整数转换为布尔值。 2.解决思路 输入一个整数。 输出布尔值并输出。 3.代码实现 numint(input("请输入一个数字")) boolnumbool(num) print(boolnum)4.运行结果

AutoDL 使用记录

AutoDL 使用记录 1.租用新实例 创建实例需要依次选择&#xff1a;计费方式 → \to → 地区 → \to → GPU型号与数量 → \to → 主机 注意事项&#xff1a; 主机 ID&#xff1a;一个吉利的机号有助于炼丹成功价格&#xff1a;哪个便宜选哪个最高 CUDA 版本&#xff1a;影响…

微前端框架 qiankun

前言 qiankun是一个基于single-spa的微前端实现库&#xff0c;帮助你构建一个生产可用的微前端架构系统。qiankun支持多种技术栈的微应用接入&#xff0c;提供了简单、解耦、技术栈无关、独立开发、独立运行、增量升级、样式隔离、资源预加载等特性&#xff0c;以及umi插件一键…

ElasticSearch知识体系详解

1.介绍 ElasticSearch是基于Lucene的开源搜索及分析引擎&#xff0c;使用Java语言开发的搜索引擎库类&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引擎。 它可以被下面这样准确的形容&#xff1a; 一个分布式的实时文档存储&#xf…

API成批分配漏洞介绍与解决方案

一、API成批分配漏洞介绍 批量分配&#xff1a;在API的业务对象或数据结构中&#xff0c;通常存在多个属性&#xff0c;攻击者通过篡改属性值的方式&#xff0c;达到攻击目的。比如通过设置user.is_admin和user.is_manager的值提升用户权限等级&#xff1b;假设某API的默认接口…

SQL Server 数据库,使用函数查询统计信息

4.1 在查询中使用函数 在前面章节已经学习了一些简单的增、删、改、查询的T-SOL.语句&#xff0c;但是为了更方便快捷地完 成大量的任务&#xff0c;SOLServer提供了一些内部函数&#xff0c;可以和SOLServer的SELECT语句联合使用&#xff0c;也可 以与UPDATE和INSERT一起使用&…

linux关于文件大小的换算

这里以我自己下载的一个wps安装包为例解释linux中的文件大小。 基础知识&#xff1a;1个块4096Byte&#xff08;即4096字节&#xff09;。 第一步&#xff1a;用ll查询&#xff0c;发现安装包文件的大小是&#xff1a;411651587字节。这是文件实际的长度&#xff08;所占用的字…

深度学习之十(图神经网络--Graph Neural Networks,GNNs)

概念 图神经网络(Graph Neural Networks,GNNs)是一类专门用于处理图数据的神经网络模型。它们的设计旨在对图结构进行学习和推断,适用于节点分类、链接预测、图生成等任务。 主要概念: 图表示: 图由节点(顶点)和边(连接节点的线条)组成。每个节点可以包含特征信息,…

cesium 融合视频

0 如果是文件&#xff0c;那相当的简单 和untiy 一样&#xff0c;可以添加材质后&#xff0c;将image 直接给材质赋值上&#xff0c;其中abcd 是四个点&#xff0c;这四个点要经过计算 <video id"video" style"display:none" controls loop autoplay&…

scrapy框架

scrapy文档 文档链接 安装指南 — Scrapy 2.5.0 文档 (osgeo.cn)https://www.osgeo.cn/scrapy/intro/install.html 创建scrapy框架 0.介绍&#xff1a; scrapy是异步非阻塞框架 异步&#xff1a;一个主线程有20个任务&#xff0c;可以来回切换 非阻塞&#xff1a;运行的程序不需…

一、服务器准备

本案例使用VMware Workstation Pro虚拟机创建虚拟服务器来搭建Linux服务器集群&#xff0c;所用软件及版本如下&#xff1a; Centos7.7-64bit 1、三台虚拟机创建 第一种方式&#xff1a;通过iso镜像文件来进行安装(不推荐) 第二种方式&#xff1a;直接复制安装好的虚拟机文…

org.springframework.web.multipart.MultipartException异常

在做文件上传时&#xff0c;如果没有指定好参数信息经常会出现下面这种异常 org.springframework.web.multipart.MultipartException: Current request is not a multipart requestat org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolv…

基于springboot + vue框架的网上商城系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

电子学会C/C++编程等级考试2021年12月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:移动路线 桌子上有一个m行n列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(m,n)。 小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把…

TZOJ 1429 小明A+B

答案&#xff1a; #include <stdio.h> int main() {int T0, A0, B0, sum0;scanf("%d", &T); //输入测试数据的组数while (T--) //循环T次{scanf("%d %d", &A, &B); //输入AB的值sum A B;if (sum > 100) //如果是三位数{…

JavaScript 内存泄漏的检测与防范:让你的程序更稳定

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

实施全链路压测的步骤是怎样的?

全链路压测是确保系统稳定性和性能的重要手段&#xff0c;能够帮助企业在面临日益复杂的业务场景时保持竞争力。通过深入了解业务、合理规划测试场景、及时监控系统指标&#xff0c;企业可以更好地利用全链路压测&#xff0c;为系统的稳定运行提供可靠的保障。同时&#xff0c;…