算法 C语言实现—折半查找(二分查找)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

折半查找,也称为二分查找,是一种在有序数组中查找特定元素的高效算法。它的基本思想是通过不断将搜索区间减半来快速定位目标元素。


一、算法原理

取数组中间元素与查找元素进行比较,如果相等,则查找成功;如果查找元素比中间元素大,则在中间元素右边的数组查找;如果查找元素比中间元素小,则在中间元素的左边数组查找。然后不断重复上述过程,直到查找成功。

例如以数组arr[10]={1,2,3,4,5,6,7,8,9,10}为例查找目标元素7


二、算法实现

现在知道了折半查找的算法原理后,我们用C语言来代码实现,如下:

#include <stdio.h>

int binary_search_iterative(int arr[], int n, int target) {   //arr[] 数组   //target  查找的目标元素
    int left = 0;          //左下标        // 初始化搜索区间的左边界         //n  元素个数
    int right = n - 1;     //右下标       // 初始化搜索区间的右边界

    // 当搜索区间有效时继续查找(左边界不超过右边界)
    while (left <= right) {
        // 计算中间位置,使用 left + (right - left)/2 防止整数溢出
        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; // 未找到目标值,返回-1
}
int main() {
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int find = 7;
    if (binary_search_iterative(arr, n, find)) {
        printf("找到了!\n");
    }

    return 0;
}

三、 算法特性

时间度:O(log₂n)

空间复杂度:  O(1)


四、关键要点

4.1  防止整数溢出

// 不推荐:当数组非常大的时候可能会溢出,数组小的时候可以使用
int mid = (left + right) / 2;

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

4.2  边界条件

循环条件:left <= right(左闭右闭区间)

更新边界:left = mid + 1 和 right = mid - 1

4.3  前提条件

数组必须有序,否则算法无法正常工作

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值