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

算法 C语言实现—折半查找(二分查找)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 目录

    文章目录

    前言

    一、算法原理

    二、算法实现

    三、 算法特性

    四、关键要点

    4.1  防止整数溢出

    4.2  边界条件

    4.3  前提条件


前言

折半查找,也称为二分查找,是一种在有序数组中查找特定元素的高效算法。它的基本思想是通过不断将搜索区间减半来快速定位目标元素。


一、算法原理

取数组中间元素与查找元素进行比较,如果相等,则查找成功;如果查找元素比中间元素大,则在中间元素右边的数组查找;如果查找元素比中间元素小,则在中间元素的左边数组查找。然后不断重复上述过程,直到查找成功。

例如以数组arr[10]={1,2,3,4,5,6,7,8,9,10}为例查找目标元素7


二、算法实现

现在知道了折半查找的算法原理后,我们用C语言来代码实现,如下:

#include <stdio.h>int binary_search_iterative(int arr[], int n, int target) {   //arr[] 数组   //target  查找的目标元素int left = 0;          //左下标        // 初始化搜索区间的左边界         //n  元素个数int right = n - 1;     //右下标       // 初始化搜索区间的右边界// 当搜索区间有效时继续查找(左边界不超过右边界)while (left <= right) {// 计算中间位置,使用 left + (right - left)/2 防止整数溢出int mid = left + (right - left) / 2; // 防止溢出// 检查中间元素是否等于目标值if (arr[mid] == target) {return mid;     // 找到目标值,返回其索引}// 如果中间元素小于目标值,说明目标值在右半部分else if (arr[mid] < target) {left = mid + 1; // 调整左边界,在右半部分继续查找}// 如果中间元素大于目标值,说明目标值在左半部分else {right = mid - 1; // 调整右边界,在左半部分继续查找}}return -1; // 未找到目标值,返回-1
}
int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int n = sizeof(arr) / sizeof(arr[0]);int find = 7;if (binary_search_iterative(arr, n, find)) {printf("找到了!\n");}return 0;
}

三、 算法特性

时间度:O(log₂n)

空间复杂度:  O(1)


四、关键要点

4.1  防止整数溢出

// 不推荐:当数组非常大的时候可能会溢出,数组小的时候可以使用
int mid = (left + right) / 2;// 推荐:防止溢出
int mid = left + (right - left) / 2;

4.2  边界条件

循环条件:left <= right(左闭右闭区间)

更新边界:left = mid + 1 和 right = mid - 1

4.3  前提条件

数组必须有序,否则算法无法正常工作

http://www.dtcms.com/a/596784.html

相关文章:

  • 如何编辑企业网站网站前端和后台
  • 【期末网页设计作业】HTML+CSS+JS 香港旅游网站设计与实现 (附源码)
  • 配置DNS主从服务
  • 基于S函数的超螺旋滑模控制实现
  • LLM + TFLite 搭建离线中文语音指令 NLU并部署到 Android 设备端
  • wordpress 整站移植怎样在拼多多上卖自己的产品
  • AI训练成本优化,腾讯云GPU实例选型
  • 某地公园桥梁自动化监测服务项目
  • Spring Boot 中的异步任务处理:从基础到生产级实践
  • 渗透测试之json_web_token(JWT)
  • c加加聊天室项目
  • Buck电路中的自举电容取值计算
  • 媒体门户网站建设方案个人网页的内容
  • 从抽象符号到现实应用:图论的奥秘
  • 雷池 WAF 免费版实测:企业用 Apache 搭环境,护住跨境电商平台
  • Flutter .obx 与 Rxn<T>的区别
  • C++中的线程同步机制浅析
  • wordpress为什么被墙西安网站seo
  • 网站程序和空间区别电商平台是干什么的
  • 机器学习探秘:从概念到实践
  • 日志易5.4全新跨越:构建更智能、更高效、更安全的运维核心引擎
  • 百度网站名片搜索引擎技术包括哪些
  • Memcached flush_all 命令详解
  • 深入探索嵌入式Linux开发:从基础到实战
  • Java复习之范型相关 类型擦除
  • android6适配繁体
  • Python | 掌握并熟悉列表、元祖、字典、集合数据类型
  • 电子电气架构 --- SOA与AUTOSAR的对比
  • 福田做商城网站建设哪家服务周到中山百度网站推广
  • 【c++】手撕单例模式线程池