C语言:二分搜索函数

一、二分搜索基本概念

二分搜索(Binary Search)是一种在有序数组中查找特定元素的高效算法,时间复杂度为O(log n)。

基本特点:

  • 仅适用于有序数组(升序或降序)

  • 每次比较将搜索范围减半

  • 比线性搜索(O(n))高效得多

二、标准二分搜索实现

1. 迭代版本(最常用)

cpp 复制代码
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; // 未找到
}

2. 递归版本

cpp 复制代码
int binarySearchRecursive(int arr[], int left, int right, int target) {
    if (left > right) {
        return -1;
    }
    
    int mid = left + (right - left) / 2;
    
    if (arr[mid] == target) {
        return mid;
    } else if (arr[mid] < target) {
        return binarySearchRecursive(arr, mid + 1, right, target);
    } else {
        return binarySearchRecursive(arr, left, mid - 1, target);
    }
}

三、二分搜索变种

1. 查找第一个等于目标的值

cpp 复制代码
int findFirst(int arr[], int size, int target) {
    int left = 0;
    int right = size - 1;
    int result = -1;
    
    while (left <= right) {
        int mid = left + (right - left) / 2;
        
        if (arr[mid] == target) {
            result = mid;
            right = mid - 1; // 继续在左半部分查找
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    
    return result;
}

2. 查找最后一个等于目标的值

cpp 复制代码
int findLast(int arr[], int size, int target) {
    int left = 0;
    int right = size - 1;
    int result = -1;
    
    while (left <= right) {
        int mid = left + (right - left) / 2;
        
        if (arr[mid] == target) {
            result = mid;
            left = mid + 1; // 继续在右半部分查找
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    
    return result;
}

3. 查找第一个大于等于目标的值

cpp 复制代码
int findFirstGreaterOrEqual(int arr[], int size, int target) {
    int left = 0;
    int right = size - 1;
    int result = -1;
    
    while (left <= right) {
        int mid = left + (right - left) / 2;
        
        if (arr[mid] >= target) {
            result = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    
    return result;
}

四、注意

1.常见错误

忘记数组必须有序

循环条件错误(应为left <= right而非left < right

边界更新错误(left = mid而非left = mid + 1

整数溢出问题

2.注意事项

  • 数组必须有序:二分搜索的前提条件

  • 整数溢出问题mid = (left + right)/2可能溢出,应使用left + (right-left)/2

  • 边界条件:正确处理left和right的更新

  • 重复元素:标准实现不保证返回哪个匹配项

相关推荐
Niuguangshuo10 小时前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
讳疾忌医丶11 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
高亦真11 小时前
今天是学习嵌入式的第37天
linux·学习·算法
罗西的思考13 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技14 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led
我不会起名字32215 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
huang57914716 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_17 小时前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法
Elsa️74617 小时前
算法一周刷题总结
c++·算法
小小程序猴118 小时前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法