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

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

相关推荐
yi.Ist31 分钟前
图论——Djikstra最短路
数据结构·学习·算法·图论·好难
数据爬坡ing1 小时前
过程设计工具深度解析-软件工程之详细设计(补充篇)
大数据·数据结构·算法·apache·软件工程·软件构建·设计语言
茜子.Java1 小时前
二分算法(模板)
算法
qq_513970442 小时前
力扣 hot100 Day74
数据结构·算法·leetcode
Cx330❀4 小时前
【数据结构初阶】--排序(三):冒泡排序、快速排序
c语言·数据结构·经验分享·算法·排序算法
效效超爱笑5 小时前
数据结构---链式结构二叉树
数据结构·算法
汤永红6 小时前
week1-[循环嵌套]蛇
数据结构·c++·算法
zhangzibiao6 小时前
LLM 与传统解析技术的融合:网页数据提取的演进与最佳实践
算法
墨染点香6 小时前
LeetCode 刷题【42. 接雨水】
算法·leetcode·职场和发展
楽码7 小时前
理解自动修复:编程语言的底层逻辑
后端·算法·编程语言