二分查找
文章目录
- 1.算法思想
- 2.代码实现
- (1)循环实现
- (2)递归实现
- 3.题目练习
1.算法思想
二分查找(折半查找):有序数组(升序或降序,可以不连续),每次缩小一半的区间。
时间复杂度:O(log n)
空间复杂度:循环实现是 O(1),递归实现是 O(log n)
2.代码实现
C语言求数组长度:
int n = sizeof(A)/sizeof(A[0]);
(1)循环实现
1.C语言实现
//binarySearch.c : 二分查找(折半查找):要求数组必须是有序的(升序或降序,可以不连续)
#include <stdio.h>int binarySearch(int A[], int n, int key)
{int left = 0, right = n-1;while(left <= right){int mid = left + (right-left)/2;if(key < A[mid]){ //目标key在左半区间right = mid-1;}else if(key > A[mid]){ //目标key在右半区间left = mid+1;}else{ //key == midreturn mid;}}return -1;
}int main()
{int A[] = {01,20,27,59,71,3702,10247}; int n = sizeof(A)/sizeof(A[0]);int pos = binarySearch(A,n,10247);printf("pos = %d\n", pos);return 0;
}
2.C++实现
#include <iostream>
#include <vector>
using std::cout;
using std::vector;int binarySearch(const vector<int>& arr, int target)
{int left = 0, right = arr.size()-1;while(left <= right){//mid的声明要放在循环里面int mid = left + (right-left)/2; //避免整数溢出if(target < arr[mid]){ //目标在左半区间right = mid -1;}else if(target > arr[mid]){ //目标在右半区间left = mid + 1;}else{return mid;}}return -1;
}int main()
{//二分查找要求是有序数组vector<int> arr = {1,3,5,7,9,11,13,15,17,19,21,23};int target = 21;int pos = binarySearch(arr, target);if(pos == -1){cout << "未找到目标值" << target << "\n";}else{cout << "目标值" << target << "的下标为" << pos << "\n";}return 0;
}
(2)递归实现
//二分查找(折半查找):要求数组必须是有序的(升序或降序,可以不连续)#include <stdio.h>//1.循环实现
int binarySearchIterative(int A[], int n, int key)
{int left = 0, right = n-1;while(left <= right){int mid = left + (right-left)/2;if(key < A[mid]){ //目标key在左半区间right = mid-1;}else if(key > A[mid]){ //目标key在右半区间left = mid+1;}else{ //key == midreturn mid;}}return -1;
}//2.递归实现
int binarySearchRecursive(int A[], int left, int right, int key)
{//递归出口if(left > right) return -1;//递归公式int mid = left + (right-left)/2;if(key < A[mid]){ //目标在左半区间return binarySearchRecursive(A, left, mid-1, key);}else if(key > A[mid]){ //目标值在右半区间return binarySearchRecursive(A, mid+1, right, key);}else{ //目标值 == A[mid]return mid;}
}int main()
{int A[] = {1,20,27,59,71,88,100,3702,10247}; int n = sizeof(A)/sizeof(A[0]);while(1){int key;printf("请输入要查找的数字: ");scanf("%d",&key);int posI = binarySearchIterative(A,n,key);int posR = binarySearchRecursive(A,0,n-1,key);printf("posI = %d\n", posI);printf("posR = %d\n", posR);}return 0;
}
3.题目练习
1.力扣704:二分查找
https://leetcode.cn/problems/binary-search/
参考答案:C语言实现
//二分查找的循环实现
int search(int* nums, int numsSize, int target) {int left = 0, right = numsSize-1;while(left <= right){int mid = left + (right-left)/2;if(target < nums[mid]){ //目标在左半区间right = mid-1;}else if(target > nums[mid]){ //目标在右半区间left = mid+1;}else{ //target == nums[mid]return mid;}}return -1;
}
相关文章:
二分查找
文章目录 1.算法思想2.代码实现(1)循环实现(2)递归实现 3.题目练习 1.算法思想 二分查找(折半查找):有序数组(升序或降序,可以不连续),每次缩小一半的区间。 时间复杂度:O(log n) 空间复杂度:循环实现是 O(1)…...
关注、取关、Redis实现共同关注、 博客推送与分页查询
Resourceprivate StringRedisTemplate stringRedisTemplate;Resourceprivate IUserService userService;Overridepublic Result follow(Long followUserId, Boolean isFollow) {//1.获取登陆的用户Long userId UserHolder.getUser().getId();//1.判断是关注还是取关if(isFollo…...
专业高清录屏软件!Mirillis Action v4.40 解锁版下载,小白看了都会的安装方法
Mirillis Action!(暗神屏幕录制软件)专业高清屏幕录像软件,被誉为游戏视频三大神器之一。这款屏幕录制软件和游戏录制软件,拥有三大硬件加速技术,支持以超高清视频画质录制桌面和实况直播,超清视频画质&…...
胤娲科技:AI重塑会议——灵动未来,会议新纪元
你是否曾经历过这样的会议场景:会议纪要不准确,人名张冠李戴;错过会议,却无从回顾关键内容;会议效率低下,时间白白流逝? 这些问题仿佛成了现代会议的“顽疾”。然而,随着AI技术的飞速…...
Python画笔案例-080 绘制 颜色亮度测试
1、绘制 颜色亮度测试 通过 python 的turtle 库绘制 颜色亮度测试,如下图: 2、实现代码 绘制 颜色亮度测试,以下为实现代码: """颜色亮度测试.py本程序需要coloradd模块支持,请在cmd窗口,即命令提示符下输入pip install coloradd进行安装。本程序演示brig…...
MATLAB工具库:数据统计分析工具MvCAT、MhAST等
MATLAB工具库:数据统计分析工具MvCAT、MhAST等 工具1:Multivariate Copula Analysis Toolbox (MvCAT)MATLAB中运行 工具2:Multi-hazard Scenario Analysis Toolbox (MhAST) 参考 The University of California-软件库-Software 工具1…...
角色动画——RootMotion全解
1. Unity(2022)的应用 由Animtor组件控制 在Animation Clip下可进行详细设置 官方文档的介绍(Animation选项卡 - Unity 手册) 上述动画类型在Rag选项卡中设置: Rig 选项卡上的设置定义了 Unity 如何将变形体映射到导入模型中的网格,以便能够将其动画化。 对于人…...
加密软件的桌面管理系统有什么?
1、IT资源管控:协助企事业单位管理者对内部计算机、宽带、打印、外围设备等IT资源进行管控,提高IT资源利用率。 2、规范内网行为:规范员工的计算机使用行为、网络使用行为、IT资产使用行为、设备使用行为 等,令员工活动在合规范围…...
【stm32】寄存器(stm32技术手册下载链接)
1、资料下载 RM0008_STM32F101xx,STM32F102xx,STM32F103xx,STM32F105xx和STM32F107xx单片机参考手册 | STMCU中文官网 2、代码 设置PB7 //设置PB7 #define SDA_IN() {GPIOB->CRL&0X0FFFFFFF;GPIOB->CRL|(u32)8<<28;} #define SDA_OUT() {GPIOB->…...
django的路由分发
前言: 在前面我们已经学习了基础的Django了,今天我们将继续学习,我们今天学习的是路由分发: 路由分发是Web框架中的一个核心概念,它指的是将不同的URL请求映射到对应的处理函数(视图)的过程。…...
《贪吃蛇小游戏 1.0》源码
好久不见! 终于搞好了简易版贪吃蛇小游戏(C语言版),邀请你来玩一下~ 目录 Snake.h Snake.c test.c Snake.h #include<stdio.h> #include<windows.h> #include<stdbool.h> #include<stdlib.h> #inclu…...
初入网络学习第一篇
引言 不磨磨唧唧,跟着学就好了,这个是我个人整理的学习内容梳理,学完百分百有收获。 1、使用的网络平台:eNSP 下载方法以及内容参考这篇文章 华为 eNSP 模拟器安装教程(内含下载地址)_ensp下载-CSDN博客https://b…...
(项目管理系列课程)项目规划阶段:项目范围管理-收集需求
在项目管理中,“规划过程组”是指一系列旨在定义和细化项目目标、规划如何达到这些目标并管理项目工作的过程。在这个过程中,“收集需求”是一个至关重要的活动,它涉及到识别和记录项目干系人的需求,以确保项目最终能够满足干系人…...
SQl注入文件上传及sqli-labs第七关less-7
Sql注入文件上传 1、sql知识基础 secure_file_priv 参数 secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。 secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能导出导入。 secure_fil…...
想成为月薪过万的软件测试工程师?快看过来!
软件测试人员的工作主要是检测软件系统中的存在的BUG,但并不是毫无逻辑的盲目抓瞎。学会运用测试思维去完成测试工作,会使你的工作事半功倍。 01 软件测试的前提假设 测试人员进行软件测试的基本假设是“有罪推断”。即:认为被测程序一定是…...
找生网站方案———未来之窗行业应用跨平台架构
1)网站设计方面的考虑 主色调采用于公司深蓝色颜色,网页整体色彩明快、大气、简洁,每个细节均经过精心处 理,网页浏览快速,导航明确清晰。 网页设计要充分考虑网页的整体感觉,每个页面的图片与网站色调的过…...
全网都在找的Python生成器竟然在这里!简单几步,让你的代码更简洁、更高效!
博客主页:长风清留扬-CSDN博客系列专栏:Python基础专栏每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法感谢大家点赞ὄ…...
插入排序,希尔排序,和归并排序
每一本数据结构和算法的教科书中,都不厌其烦的介绍了排序算法。不厌其烦的介绍10余种不同的排序。那么实际编程中用得到那么多排序算法吗?当然用不到。那么为什么全世界的教科书都这么写呢?显然是醉翁之意不在酒。 数组,是每个编…...
Prompt 模版解析:诗人角色的创意引导与实践
Prompt 模版解析:诗人角色的创意引导与实践 Prompt 模版作为一种结构化工具,旨在为特定角色——本例中的“诗人”——提供明确的指导和框架。这一模版详尽地描绘了诗人的职责、擅长的诗歌形式以及创作规则,使其能在自动化系统中更加精确地执…...
zookeeper选举kafka集群的controller
zookeeper选举kafka集群的controller目录 文章目录 zookeeper选举kafka集群的controller目录前言一、实操体验controller的选举二、模拟controller选举四、删除controller节点 前言 kafka集群的controller是kafka集群中一个有特殊作用的broker,负责整个kafka集群的…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
