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的更新

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

相关推荐
乌萨奇也要立志学C++19 分钟前
【洛谷】6 道题吃透堆的应用:模板堆、第 k 小、最小函数值等全攻略
算法
合作小小程序员小小店1 小时前
web网页开发,在线%推荐算法学院培养计划,图书推荐,基于Python,FlaskWeb,用户和物品推荐MySql
python·mysql·算法·flask·推荐算法
Cx330❀1 小时前
《C++ STL:vector类(上)》:详解基础使用&&核心接口及经典算法题
开发语言·c++·经验分享·算法
那我掉的头发算什么2 小时前
【数据结构】二叉树的高频热门面试题大全
java·开发语言·数据结构·python·算法·链表·intellij idea
遇安.YuAn2 小时前
JAVA之求平方根
java·开发语言·算法
禁默3 小时前
机器学习基础入门(第三篇):监督学习详解与经典算法
学习·算法·机器学习
sensen_kiss3 小时前
INT305 Machine Learning 机器学习 Pt.1 导论与 KNN算法
人工智能·算法·机器学习
软件算法开发5 小时前
基于黑翅鸢优化的LSTM深度学习网络模型(BKA-LSTM)的一维时间序列预测算法matlab仿真
深度学习·算法·lstm·时间序列预测·黑翅鸢优化·bka-lstm
小南家的青蛙5 小时前
LeetCode第79题 - 单词搜索
算法·leetcode·职场和发展
PAK向日葵5 小时前
【算法导论】PDD 0928 笔试题解
算法·面试