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

数组-二分查找

目录

算法思想:

实践:

备注:


二分查找是一种高效的查找算法,适用于在 有序数组 或列表中快速定位目标元素的索引。

重要事情说三遍:使用前提:数组有序,无重复,如果数组未排序,先进行排序去重处理。

                                               数组有序,无重复,如果数组未排序,先进行排序去重处理。

                                               数组有序,无重复,如果数组未排序,先进行排序去重处理。        

算法思想:

  1. 初始化左右边界: 定义两个指针 leftright,分别指向数组的起始位置和终止位置。
  2. 计算中间位置: 根据公式 mid = left + (right - left) // 2 计算中间位置索引,避免大数相加可能导致的溢出。(mid=(left+right)/2)这种写法当left和right很大时,可能数据溢出。

实践:

二分查找中,容易写错的地方往往是边界条件区间的定义,这是导致程序混乱的根本原因。这里详细解释一下这两种常见的区间定义(左闭右闭左闭右开)及其实现逻辑。

左闭右闭:

#include <stdio.h>int binarySearch(int arr[], int size, int target) {int left = 0;int right = size - 1;while (left <= right) {// 使用向下取整的公式计算中点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; // 未找到目标值
}int main() {int arr[] = {1, 3, 5, 7, 9, 11}; // 偶数长度数组int size = sizeof(arr) / sizeof(arr[0]);int target = 7;int result = binarySearch(arr, size, target);if (result != -1) {printf("目标值 %d 的索引是 %d\n", target, result);} else {printf("目标值 %d 未找到。\n", target);}return 0;
}

左闭右开:

#include <stdio.h>int search(int* nums, int numsSize, int target) {int left = 0;int right = numsSize; // 左闭右开区间while (left < right) { // 循环条件:left < rightint mid = left + (right - left) / 2;if (nums[mid] == target) {return mid; // 找到目标值} else if (nums[mid] > target) {right = mid; // 调整右边界} else {left = mid + 1; // 调整左边界}}return -1; // 未找到目标值
}int main() {int nums[] = {1, 3, 5, 7, 9};int numsSize = sizeof(nums) / sizeof(nums[0]);int target = 7;int result = search(nums, numsSize, target);if (result != -1) {printf("目标值 %d 的索引是 %d\n", target, result);} else {printf("目标值 %d 未找到。\n", target);}return 0;
}

备注:

在二分查找中,左中点(向下取整)右中点(向上取整) 的计算方式会影响算法的细节,但在实际应用中,它们的功能基本是等效的。

http://www.lryc.cn/news/524153.html

相关文章:

  • 如何使用 Python 进行文件读写操作?
  • springcloud中的Feign调用
  • 【部署】将项目部署到云服务器
  • 2024年AI大模型技术年度总结与应用实战:创新与突破并进
  • docker离线安装及部署各类中间件(x86系统架构)
  • SuperdEye:一款基于纯Go实现的间接系统调用执行工具
  • PCL 新增自定义点类型【2025最新版】
  • Docker导入镜像
  • PyTorch使用教程(9)-使用profiler进行模型性能分析
  • SpringBoot中使用MyBatis-Plus详细介绍
  • PCL 部分点云视点问题【2025最新版】
  • 【Linux】常见指令(三)
  • 第5章:Python TDD定义Dollar对象相等性
  • nuxt3项目打包部署到服务器后配置端口号和开启https
  • MongoDB文档查询
  • 【GORM】初探gorm模型,字段标签与go案例
  • Windows下的Milvus安装秘籍:向量数据库轻松上手
  • 在GUI中添加一个Label
  • hive连接mysql报错:Unknown version specified for initialization: 3.1.0
  • Unity Shader学习日记 part5 CG基础
  • 第7章:Python TDD测试Franc对象乘法功能
  • 两级式三相光伏并网逆变器Matlab/Simulink仿真模型
  • redis性能优化参考——筑梦之路
  • Ubuntu 22.04 TLS 忘记root密码,重启修改的解决办法
  • HTML<bdo>标签
  • STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态
  • 【机器学习实战中阶】使用SARIMAX,ARIMA预测比特币价格,时间序列预测
  • 各语言镜像配置汇总
  • 细说STM32F407单片机电源低功耗StopMode模式及应用示例
  • PHP语言的循环实现