【入门级-算法-3、基础算法:二分法】

1、定义:

二分法又叫做二分查找法或者折半查找法。是一种高效的数据查找算法,适用于在已经排序好顺序的序列中查找数据。

2、核心思想

二分法是一种在有序集合中快速查找特定元素的算法。将问题分解为更小的子问题,通过每次将搜索范围缩小一半来极快地逼近答案。

3、举例说明:猜数字游戏

假设我让你在1到100之间猜一个我心里想的数字。

如果你的策略是从1开始一个一个地猜(顺序查找),最坏情况下你需要猜100次。

如果你使用二分法:

你先猜 50(中间值)。

如果我告诉你"大了",你就知道数字在149之间。如果你告诉你"小了",你就知道数字在51100之间。

然后你在剩下的一半范围里,再猜中间值... 如此反复。

使用这种方法,你最多只需要猜7 次就能猜对!效率对比天差地别。

假设你要猜的数据是18,需要的中间数字分别是:50,25,13,18,四次就可以完成。

4、算法前提

使用二分法有一个至关重要的前提条件:待查找的数组或集合必须是有序的(单调的)。如果数组是无序的,二分法将完全失效,因为你无法根据中间值的大小判断目标值在哪一半。

5、算法步骤(在升序数组中查找目标值 target)

我们使用三个指针来标记搜索范围:left(左边界), right(右边界), mid(中间点)。

初始化:设置 left = 0(数组起始索引),right = n-1(数组末尾索引)。

循环:当 left <= right 时,重复步骤3-5。

计算中间:计算中间索引 mid = left + (right - left) // 2。

比较判断:

如果 numsmid == target,找到了! 返回 mid。

如果 numsmid < target,说明目标值在右半部分。调整左边界:left = mid + 1。

如果 numsmid > target,说明目标值在左半部分。调整右边界:right = mid - 1。

循环结束:如果循环结束(即 left > right)仍未找到,说明目标值不存在于数组中,返回 -1。

6、代码实现

标准二分查找(查找目标值)

问题描述:在有序数组 nums 中查找指定目标数据,若存在返回其索引,否则返回 -1。

举例说明

#include <stdio.h>

int binary_search(int nums\[\], int numsSize, int target) {

int left = 0;

int right = numsSize - 1;

while (left <= right) {

int mid = left + (right - left) / 2; // 防止溢出

if (numsmid == target) {

return mid; // 找到目标,返回索引

} else if (numsmid < target) {

left = mid + 1; // 目标在右半部分

} else {

right = mid - 1; // 目标在左半部分

}

}

return -1; // 未找到

}

int main() {

int nums\[\] = {1, 3, 5, 7, 9, 11};

int target = 5;

int index = binary_search(nums, 6, target);

printf("Target %d found at index: %d\n", target, index); // 输出:Target 5 found at index: 2

return 0;

}

相关推荐
CodeRecycle29 分钟前
Python 自动配置 pip 支持库(通过 Windows Bat 脚本)
算法
liliangcsdn1 小时前
特质偏度因子的计算示例和分析
算法
荆棘鸟智能1 小时前
无人机遥感图像实时拼接算法工程实践:从特征提取到全景融合的完整技术链路
算法·无人机
xxwxx__2 小时前
C++ STL set 与 map 全套详解:关联式容器、红黑树底层、代码坑点、刷题实战
数据结构·c++
6Hzlia2 小时前
【Classic 150 刷题计划】 LeetCode 58. 最后一个单词的长度 | C++ 极简反向遍历与单变量状态机
算法
AgentMaster2 小时前
企业如何应用智能客服?5 个典型场景的技术架构与实施路径
大数据·算法
程曦曦2 小时前
MySQL 生产库误删 98 张表后的时间点恢复实战:从 binlog 解析到资金对账
linux·数据结构·其他·算法·ubuntu·运维开发
郝学胜-神的一滴3 小时前
Effective Python 条款 13:善用星号解包,告别下标切片拆分的坑
服务器·开发语言·数据结构·python·程序人生·pycharm
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出流水线上的“独特零件编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
weixin_307779133 小时前
C++代码实现MATLAB中的ode45函数功能
开发语言·c++·算法·matlab