【算法】(C语言):二分查找

二分查找:

  1. 获取查找区域的中间位置。
  2. 若中间位置的数据就是要找的值,则返回true。若要找的值 小于 中间位置的数据,则往左边查找。若要找的值 大于 中间位置的数据,则往右边查找。
  3. 重复1和2,若没有要找的值,则返回false。

注:二分查找的要求:数据有序(即已排好序)。

时间复杂度:最好情况 O(1),最坏情况 O(logn),平均情况 O(logn)

  • 每次找中间位置,每次查找范围减半,查找次数最多logn,因此总时间约 O(logn)。
  • 最好情况,是第一个中间位置就是要找的值,时间O(1)。

空间复杂度:【迭代】O(1),【递归】 O(logn)

  • 【迭代】只重复使用存储中间位置数据的空间,不随数据量变动而变动,因此空间使用是常量O(1)。
  • 【递归】需使用栈存储递归时的中间位置数据,最多查找次数logn,空间使用约 O(logn) 。


C代码实现:

【迭代】

int search(int *array, int length, int data)			// binary search
{// 起始索引,结束索引,中间位置索引int start = 0, end = length - 1;int midindex = start + ceil((end - start ) / 2);// 索引号越界,退出循环while(midindex >= 0 && midindex <= end){   // 找到匹配的值,返回1(true)if(array[midindex] == data) return 1;// 找的值比中间值小,往左边找,结束索引为中间位置前一位if(array[midindex] > data) end = midindex - 1;//  找的值比中间值大,往右边找,开始索引为中间位置后一位else start = midindex + 1;// 循环找下一个中间位置midindex = start + ceil((end - start ) / 2);}// 没找到,返回0(false)return 0;
}

【递归】

int search2(int *array, int start, int end, int data)		// binary search (recursion)
{// 获取中间位置索引int midindex = start + ceil((end - start ) / 2);// 索引号越界,即没找到,返回0(false)if(midindex < 0 || midindex > end) return 0;// 找到值,返回1(true)if(array[midindex] == data) return 1;// 要找的值 比中间值小,往左边递归查找if(array[midindex] > data) search2(array, 0, midindex - 1, data);// 要找的值 比中间值大,往右边递归查找else search2(array, midindex + 1, end, data);
}


完整代码:(binarysearch.c)

#include <stdio.h>
#include <math.h>int search(int *, int, int);				// binary search
int search2(int *, int, int, int);			// binary search (recursion)
void traverse(int *, int);				    // show element one by one	int main(void)
{int arr[] = {1,2,3,5,6,8,9};int n = sizeof(arr) / sizeof(int);traverse(arr, n);	printf("[no recursion] find '8' (1:true, 0:false): %d\n", search(arr, n, 8));printf("[  recursion ] find '8' (1:true, 0:false): %d\n", search2(arr, 0, n, 8));printf("[no recursion] find '4' (1:true, 0:false): %d\n", search(arr, n, 4));printf("[  recursion ] find '4' (1:true, 0:false): %d\n", search2(arr, 0, n, 4));return 0;
}int search(int *array, int length, int data)			// binary search
{int start = 0, end = length - 1;int midindex = start + ceil((end - start ) / 2);while(midindex >= 0 && midindex <= end){if(array[midindex] == data) return 1;if(array[midindex] > data) end = midindex - 1;else start = midindex + 1;midindex = start + ceil((end - start ) / 2);}return 0;
}int search2(int *array, int start, int end, int data)		// binary search (recursion)
{int midindex = start + ceil((end - start ) / 2);if(midindex < 0 || midindex > end) return 0;if(array[midindex] == data) return 1;if(array[midindex] > data) search2(array, 0, midindex - 1, data);else search2(array, midindex + 1, end, data);
}void traverse(int *array, int length)				// show element one by one	
{printf("elements(%d): ", length);for(int k = 0; k < length; k++){printf("%d  ", array[k]);}printf("\n");
}

编译链接: gcc -o binarysearch binarysearch.c

执行可执行文件: ./binarysearch

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

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

相关文章

LM-Cocktail:一种创新的模型合并方法打破预训练语言模型微调后的性能局限,实现语言模型在一般任务与特定领域的均衡高性能

LM-Cocktail:一种创新的模型合并方法打破预训练语言模型微调后的性能局限,实现语言模型在一般任务与特定领域的均衡高性能 使语言模型的微调类似于调制一杯精致的鸡尾酒。模型合并可用于提高单个模型的性能。我们发现此方法对于大型语言模型和密集嵌入模型也很有用,并设计了…

业界数据架构的演变

目录 一、概述 二、业务处理-单体架构 三、业务处理-微服务架构 四、数据分析-大数据Lambda架构 五、数据分析-Kappa架构 六、数据分析-LambdaKappa混合架构 七、湖仓一体架构 一、概述 近年来随着越来越多的大数据技术被开源&#xff0c;例如&#xff1a;HDFS、Spark等…

Linux 进程与服务管理:使用systemctl、service命令管理系统服务

Linux 进程与服务管理&#xff1a;使用systemctl、service命令管理系统服务 在Linux系统中&#xff0c;进程和服务的管理是系统运维的重要组成部分。随着Linux的发展&#xff0c;systemd成为了大多数现代Linux发行版的初始化系统&#xff0c;它提供了systemctl命令来管理系统服…

【Linux进程通信】共享内存

目录 共享内存函数 头文件 shmget ftok函数​ shmat shmdt shmctl 共享内存区是最快的IPC 形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到操作系统内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据…

《向量数据库指南》——Milvus Cloud查询增强如何提升 RAG Pipeline 效果?

查询增强 1.假设性问题 这一方法首先使用LLM为每一条文档块生成一些假设问题,这些文档块可以回答与之对应的假设问题。在RAG阶段,进行一个query-to-query的搜索,先搜索到相关的假设问题,然后找到对应的文档块,再通过它们生成最后的回答。 这里的query-to-query指的是embed…

【数据库】仓库管理数据库(练习样例)

某连锁超市需要设计实现一个仓库管理系统&#xff0c;要求每个仓库可以有多名仓库管理员&#xff0c;每个仓库管理员只负责管理一个仓库&#xff0c;同时每个仓库都配备了一名仓库主管&#xff1b;不同的仓库存放的是不同类型的货品&#xff0c;每种货品只存放在固定的仓库中&a…

R语言数据分析案例40-华安中证基金多元线性回归和分析预测

一、引言 基金是一种非常受欢迎的投资工具&#xff0c;由于其具有风险分散、专业管理等特点&#xff0c;越来越多的投资者选择将资金投入基金市场。然而&#xff0c;基金的表现却受到很多因素的影响&#xff0c;如股票市场的整体表现、基金管理人员的能力、基金规模、基金管理…

SpringAOP如何控制只在生产环境执行AOP类

SpringAOP场景原理、如何在特定环境(如dev不执行、prod执行)不执行AOP 1、在定义AOP切面类的时候&#xff0c;用注解Profile&#xff0c; 再配合配置application.properties 的 spring.profiles.activeprod Aspect Component Profile("prod") public class LoggingA…

二二复制模式,发展下属并形成一个销售网络体系来实现收入增长!

二二复制模式&#xff0c;又称为双轨制&#xff0c;是一种直销理念的营销模式&#xff0c;其核心在于通过发展下属并形成一个销售网络体系来实现收入增长。以下是对二二复制模式的详细讲解&#xff0c;包括其优势和玩法介绍&#xff0c;以及适合的行业。 一、二二复制模式的定…

【React性能优化】父组件渲染如何避免子组件不必要的渲染

类组件&#xff1a; 需要注意的点是&#xff0c;尽量避免事件处理函数直接返回&#xff0c;如以下写法&#xff1a; class LoggingButton extends React.Component {handleClick() {console.log(this is:, this);}render() {// 此语法确保 handleClick 内的 this 已被绑定。r…

Flutter集成高德导航SDK(Android篇)(JAVA语法)

先上flutter doctor&#xff1a; flutter sdk版本为&#xff1a;3.19.4 引入依赖&#xff1a; 在app的build.gradle下&#xff0c;添加如下依赖&#xff1a; implementation com.amap.api:navi-3dmap:10.0.700_3dmap10.0.700navi-3dmap里面包含了定位功能&#xff0c;地图功能…

UML图的分类

uml图是用来展示大型软件工程之间的内部关系&#xff0c;如果只用代码表示&#xff0c;密密麻麻的谁看都头疼。 UML图分为结构图和行为图 .类图&#xff1a;一组对象&#xff0c;接口&#xff0c;协作和它们之间的关系 对象图&#xff1a;一组对象以及它们之间的关系 用例图…

Mysql在linux系统中定时备份

1. 创建备份脚本 #!/bin/bash# 设置数据库名、用户名和密码 DB_NAME"your_database_name" DB_USER"your_username" DB_PASSWORD"your_password"# 设置备份目录 BACKUP_DIR"/path/to/your/backup/directory"# 创建备份目录如果不存在 …

Kafka搭建(集群版)

Kafka单机版 部署前提 VMware环境 : 两台centos系统 Jdk包:jdk-8u202-linux-x64.tar.gz Kafka包:kafka_2.12-3.5.0.tgz Zookeeper包:apache-zookeeper-3.7.2-bin.tar.gz 百度网盘自取: 链接: https://pan.baidu.com/s/11EWuhBoSmH3musd_3Rgodw?pwde32t 提取码: e32t Kafka搭建…

运行程序报错died with <Signals.SIGKILL: 9>问题定位及解决方法

运行程序报错died with 报错 当我在运行程序时&#xff0c;报错&#xff1a; Traceback (most recent call last):File "/home/anaconda3/envs/scene_graph_benchmark/lib/python3.8/runpy.py", line 194, in _run_module_as_mainreturn _run_code(code, main_glo…

免密登录ssh

前言&#xff1a; 1.基于口令的认证&#xff08;password认证&#xff09;&#xff1a; 客户端向服务器发出password认证请求&#xff0c;将用户名和密码加密后发送给服务器&#xff0c;服务器将该信息解密后得到用户名和密码的明文&#xff0c;与设备上保存的用户名和密码进行…

香橙派AIpro开发板评测:部署yolov5模型实现图像和视频中物体的识别

OrangePi AIpro 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;自发布以来就引起了我的极大关注。其配备的8/20TOPS澎湃算力&#xff0c;堪称目前开发板市场中的顶尖性能&#xff0c;实在令人垂涎三尺。如此强大的板子&#xff0c;当然要亲自体验一番。今天非常荣幸地拿到…

边界无限陈佩文:红蓝对抗安全演练常态化的各方分析

虽然常态化演练尚未正式开始&#xff0c;但我们仍然希望对各方的表现进行一些分析和预测&#xff0c;以辅助我们对市场的判断和决策。同时&#xff0c;也希望通过这些初步的见解&#xff0c;抛砖引玉&#xff0c;引发更多有价值的讨论和观点。 “船停在码头是最安全的&#xf…

Hi3861 OpenHarmony嵌入式应用入门--SNTP

sntp&#xff08;Simple Network Time Protocol&#xff09;是一种网络时间协议&#xff0c;它是NTP&#xff08;Network Time Protocol&#xff09;的一个简化版本。 本项目是从LwIP中抽取的SNTP代码&#xff1b; Hi3861 SDK中已经包含了一份预编译的lwip&#xff0c;但没有…

怎么把数据转换成百度k线图

要将数据转换成百度K线图&#xff0c;您需要按照百度K线图的要求对数据进行处理和格式化。以下是一个简单的示例&#xff0c;演示如何将数据转换成百度K线图的格式&#xff1a; python import json # 假设您有以下数据 data [ {"date": "2021-01-01"…