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

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

相关推荐
wearegogog12321 小时前
基于 MATLAB 的卡尔曼滤波器实现,用于消除噪声并估算信号
前端·算法·matlab
一只小小汤圆21 小时前
几何算法库
算法
Evand J21 小时前
【2026课题推荐】DOA定位——MUSIC算法进行多传感器协同目标定位。附MATLAB例程运行结果
开发语言·算法·matlab
leo__5201 天前
基于MATLAB的交互式多模型跟踪算法(IMM)实现
人工智能·算法·matlab
忆锦紫1 天前
图像增强算法:Gamma映射算法及MATLAB实现
开发语言·算法·matlab
t198751281 天前
基于自适应Chirplet变换的雷达回波微多普勒特征提取
算法
guygg881 天前
采用PSO算法优化PID参数,通过调用Simulink和PSO使得ITAE标准最小化
算法
老鼠只爱大米1 天前
LeetCode算法题详解 239:滑动窗口最大值
算法·leetcode·双端队列·滑动窗口·滑动窗口最大值·单调队列
mit6.8241 天前
序列化|质数筛|tips|回文dp
算法
rgeshfgreh1 天前
C++字符串处理:STL string终极指南
java·jvm·算法