当前位置: 首页 > news >正文

查找------折半查找(二分查找)

目录

折半查找算法原理

折半查找的步骤

折半查找的时间复杂度

折半查找的空间复杂度

例题演示:

题目描述

具体代码:


折半查找算法原理

折半查找(也称为二分查找)是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将搜索区间不断分成两半,每次比较中间元素与目标值,然后根据比较结果排除一半的搜索区间,直到找到目标值或者搜索区间为空。

折半查找的步骤

  1. 确定搜索区间的初始边界,通常是数组的起始和结束下标。
  2. 计算搜索区间中间位置的索引 mid = (low + high) / 2
  3. 比较中间元素 arr[mid] 与目标值 key
    • 如果 arr[mid] 等于 key,则找到目标值,返回中间元素的索引。
    • 如果 arr[mid] 大于 key,则目标值可能在左半区间,更新 high = mid - 1
    • 如果 arr[mid] 小于 key,则目标值可能在右半区间,更新 low = mid + 1
  4. 重复步骤2和3,直到 low 大于或等于 high,如果在此之前找到了目标值,则返回相应的索引;如果搜索区间为空,则返回一个表示未找到的特殊值(通常是-1)。

折半查找的时间复杂度

折半查找的时间复杂度为O(log n),这意味着在最坏的情况下,查找操作的比较次数与数组长度的对数成正比。这使得折半查找在处理大量数据时非常高效。

折半查找的空间复杂度

折半查找的空间复杂度为O(1),因为它不需要额外的存储空间,只使用几个变量来存储搜索区间的边界和中间位置的索引。

折半查找算法是一种经典的高效搜索算法,广泛应用于已排序数据的查找场景. 

例题演示:

题目描述


现有一个按非递减顺序排列,且不包含重复数字的整型数组 nums 和一个目标值 target ,请用二分法查找出数组中等于target 的元素,并返回它的下标 i (数组下标从 0 开始)否则返回 -1。

输入输出格式
输入格式
第一行输入一个整数 numsSize;
第二行输入一个数组 nums ;
第三行输入一个整数 target。
输出格式
输出一个整数。

输入输出样例1
输入
4
0 1 2 3
2
输出
2

输入输出样例2
输入
5
2 4 6 7 8
6
输出
2

具体代码:

#include<stdio.h>
int main(void)
{int n;int arr[100] = { 0 };int target;scanf("%d",&n);for (int i = 0; i < n; i++)scanf("%d", &arr[i]);scanf("%d", &target);int front = 0;int rear = n - 1;int middle;int flag = 0;while (front <= rear){middle = (front + rear) / 2;if (arr[middle] == target){flag = 1;break;}else if(arr[middle] > target){rear = middle - 1;middle = (front + rear) / 2;}else if (arr[middle] < target){front = middle + 1;middle = (front + rear) / 2;}}if (flag)printf("%d", middle);elseprintf("-1");return 0;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 掌握ThinkPHP6中的数据验证技巧,提升开发效率
  • 【PyTorch】深度学习PyTorch加载数据
  • 区块链国赛第六套样题(关于运维)
  • Java基础——自学习使用(多态)
  • TCP与UDP传输的学习
  • GraphQL:API开发的未来,重塑数据交互的艺术
  • 发条朋友圈赚900,这钱太好赚了吧?
  • 照片逼真肖像动画的音频驱动合成——AniPortrait翻译与调试
  • 【YOLO5 项目实战】(7)YOLO5 手势识别
  • 45+用户占比近30%,网文产业如何赋能IP长链?
  • 如何使用gewe开发微信机器人
  • 010 OSS文件上传
  • 自动化开发流程:使用 GitHub Actions 进行 CI/CD
  • 使用 Dify 和 AI 大模型理解视频内容:Qwen 2 VL 72B
  • React+Vis.js(05):vis.js的节点的点击事件
  • $translatePartialLoader加载失败及解决方式
  • 【个人向】《HTTP图解》阅后小结
  • 3.7、@ResponseBody 和 @RestController
  • Bytom交易说明(账户管理模式)
  • Elasticsearch 参考指南(升级前重新索引)
  • Iterator 和 for...of 循环
  • Java 23种设计模式 之单例模式 7种实现方式
  • JAVA SE 6 GC调优笔记
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • React-Native - 收藏集 - 掘金
  • tab.js分享及浏览器兼容性问题汇总
  • Vue官网教程学习过程中值得记录的一些事情
  • 经典排序算法及其 Java 实现
  • 码农张的Bug人生 - 见面之礼
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 1.Ext JS 建立web开发工程
  • AI算硅基生命吗,为什么?
  • Java数据解析之JSON
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​渐进式Web应用PWA的未来
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C#)一个最简单的链表类
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)Controller接口控制器详解(三)
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET Core WebAPI中封装Swagger配置
  • .net 调用海康SDK以及常见的坑解释
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...