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

news2024/11/18 16:52:36

二分查找:

  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.coloradmin.cn/o/1896714.html

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

相关文章

Mall,正在和年轻人重新对话

【潮汐商业评论/原创】 结束了一下午的苦闷培训&#xff0c;当Cindy赶到重庆十字大道时&#xff0c;才发现十字路口上的巨大“飞行棋”在前两天就已经撤展了。 “来了又错过&#xff0c;就会觉得遗憾&#xff0c;毕竟这样的路口不多&#xff0c;展陈又不可能会返场。” 飞行棋…

【机器学习】机器学习在AI Agent中的影响与作用

文章目录 &#x1f680;Al Agent是什么&#x1f4d5;Al Agent的工作原理与技术&#x1f4aa;Al Agent应用领域&#x1f680;智能家居应用&#x1f308;医疗健康领域⭐金融服务行业&#x1f302;交通运输管理&#x1f3ac;教育培训应用 &#x1f512;Al Agent优势与挑战✊Al Age…

苹果获得OpenAI董事会观察员职位、Runway最新估值40亿美元

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 据知情人士透露&#xff0c;苹果应用商店&#xff08;App Store&#xff09;负责人、前营销主管Phil Schiller被选中担任这一职位。这位知情人士说&#xff0c;作为董事会观察员&#xff0c;他不会以正…

【综合能源】计及碳捕集电厂低碳特性及需求响应的综合能源系统多时间尺度调度模型

目录 1 主要内容 2 部分程序 3 实现效果 4 下载链接 1 主要内容 本程序是对《计及碳捕集电厂低碳特性的含风电电力系统源-荷多时间尺度调度方法》方法复现&#xff0c;非完全复现&#xff0c;只做了日前日内部分&#xff0c;并在上述基础上改进升级为电热综合电源微网系统&…

【uni-app】基础

一、官网 网址&#xff1a;https://zh.uniapp.dcloud.io/tutorial/其他辅助网页讲解&#xff1a;https://www.wenjiangs.com/doc/7y94pldun2插件下载free&#xff1a;https://ext.dcloud.net.cn/ 二、提示框 用uni.showToast提醒的次数超过7个字的时候就会导致文字显示不全&…

SSL证书遇到问题时的解决方案

当SSL证书遇到问题时&#xff0c;可能会影响到网站的安全性和用户体验&#xff0c;常见的问题包括证书过期、域名不匹配、证书链不完整、证书颁发机构不受信任、私钥丢失或损坏等。 一、证书过期 解决方法&#xff1a;更新或续订证书。这通常涉及联系你的SSL证书提供商&#…

ACL 2024 | CoCA:自注意力的缺陷与改进

近年来&#xff0c;在大语言模型&#xff08;LLM&#xff09;的反复刷屏过程中&#xff0c;作为其内核的 Transformer 始终是绝对的主角。然而&#xff0c;随着业务落地的诉求逐渐强烈&#xff0c;有些原本不被过多关注的特性&#xff0c;也开始成为焦点。例如&#xff1a;在 T…

Shopee Live的订单量在泰国猛增超40倍!然鹅,泰国站佣金费率上调,还有得做吗?

Shopee&#xff0c;作为东南亚地区电子商务领域的佼佼者&#xff0c;不仅在区域内树立了行业标杆&#xff0c;更在泰国这一充满活力的市场中占据了举足轻重的地位。其创新的商业模式与不断优化的服务体验&#xff0c;赢得了广大消费者的青睐与信赖。近日&#xff0c;Shopee官方…

合成孔径雷达原理与应用(四)

合成孔径雷达原理与应用&#xff08;四&#xff09; 2. 应用2.7. 沉降形变滑坡2.7.1. 地面沉降2.7.2. 铁路沉降2.7.3. 大坝形变2.7.4. 机场形变2.7.5. 桥梁形变2.7.6. 滑坡监测 2. 应用 2.7. 沉降形变滑坡 2.7.1. 地面沉降 由图2-17可知&#xff0c;从整体的区域分布上来看&a…

iPad手写笔哪款比较好?2024五款爆火iPad电容笔推荐!新手必看!

在iPad等触控设备日益普及的今天&#xff0c;手写笔作为提升生产力和创意表达的重要工具&#xff0c;正受到越来越多用户的青睐。然而&#xff0c;随着市场需求的激增&#xff0c;市面上电容笔品牌与型号繁多&#xff0c;跟风购买往往容易遭遇“踩雷”情况。因此&#xff0c;作…

认识不-物联网“六域模型”有哪些有什么作用

如下参考源于苏州稳联授权可见认知域-感知域-网络域-应用域-管理域-安全域-物联网六域模型 苏州稳联 (iotrouter.cn) 认识物联网“六域模型”&#xff1a;构成与作用 “六域模型”是一个有效的框架。这个模型通过将物联网划分为六个相互关联的域&#xff0c;帮助我们更好地理…

docker介绍与详细安装

1 docker 介绍 1.1 虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打破实…

关键帧功能怎么使用 关键帧控制视频特效怎么用 会声会影视频剪辑软件教程

一篇文章&#xff0c;轻松掌握关键帧的用法&#xff0c;小白也能将关键帧玩得出神入化。在专业级的视频剪辑软件中&#xff0c;滤镜、转场、调色、遮罩等功能都离不开关键帧。可以毫不夸张地说&#xff0c;学会了关键帧的用法&#xff0c;就等于掌握了视频特效的基本逻辑 一、…

Qualcomm QCA206x EasyMesh For Ubuntu

1. 引言 关于EasyMesh概念我们这里就不再过多的赘述&#xff0c;此篇文档的目的是&#xff0c;让广大初学者&#xff0c;有一个很方便的平台进行EasyMesh的学习和测试。 2. X86 Ubuntu平台 2.1 硬件环境准备 备注&#xff1a;QCA206x WiFi module推荐使用移远的FC64E/FC66E。…

详解yolov5的网络结构

转载自文章 网络结构图&#xff08;简易版和详细版&#xff09; 此图是博主的老师&#xff0c;杜老师的图 网络框架介绍 前言&#xff1a; YOLOv5是一种基于轻量级卷积神经网络&#xff08;CNN&#xff09;的目标检测算法&#xff0c;整体可以分为三个部分&#xff0c; ba…

大数据平台之CDC (Chanage Data Capture) 方案

Change Data Capture (CDC) 是一种用于跟踪和捕获数据库中数据变更的技术&#xff0c;它可以在数据发生变化时实时地将这些变更捕获并传递到下游系统。以下是一些常用的开源 CDC 方案&#xff1a; 1. Flink CDC Flink CDC 是基于 Apache Flink 的一个扩展&#xff0c;它通过集…

.NET下的开源OCR项目:解锁图片文字识别的新篇章

在数字化时代&#xff0c;从图片中高效准确地提取文字信息已成为众多应用场景的迫切需求。OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术正是满足这一需求的关键技术。对于.NET开发者而言&#xff0c;幸运的是&#xff0c;存在多个开…

Wireshark网络抓包工具入门指南

目录 引言 安装抓包工具 抓包基础概念 抓包步骤 流程 抓包工具头的分析 14.3 以太网的完整帧格式 粘包与拆包现象解析及解决方案 发生原因 解决方案 14.3.1以太网头 14.3.2 IP头 14.3.3 UDP头 14.3.4 TCP头 引言 Wireshark是一款功能强大的开源网络协议分析器&am…

2024企业加密软件丨为什么企业需要防泄密

企业为什么需要防泄密&#xff1f; 企业的数据中包含了许多核心机密&#xff0c;如研发成果、商业计划、客户资料等。这些信息的泄露可能使竞争对手获得不正当的优势&#xff0c;给企业带来严重损失。 数据泄露事件往往会对企业的声誉造成负面影响&#xff0c;降低客户信任度…

数字化装备场转型,RFID军标桌面发卡器再现创新风暴

在过去&#xff0c;人们主要依靠条形码扫描枪、简单手工抄录等方式来记录数据。部队数字化装备场的出现&#xff0c;对普通发卡器有更高层次的需求&#xff1a;广州一芯未来在传统发卡器基础上&#xff0c;研发出一款利用无线射频信号与RFID军标标签进行通信的设备——RFID军标…