【一篇文章让你掌握二分算法C语言】

一,二分查找

二分查找是一种在有序数组中查找一特定的元素的搜索算法。它是通过把数组分成两部分,并将目标元素与中间值比较,从而确定目标元素所在的部分,然后继续在该部分进行查找,重复此过程直到确定目标元素不存在或把该元素找到为止。

1,左闭右闭区间 [left, right]

在二分查找中 左闭右闭区间 [left, right] 表示搜索范围,表示着搜索范围包含左右边界索引指向的元素。
left 表示搜索区间的起始索引,而 right 表示搜索区间的结束索引,并且 leftright 所指向的元素都在区间里面,所以判断条件要加上当 left 等于 right 时,该区间仍包含一个元素,需要检查。

#include<stdio.h>

int binarySearch(int *nums,int numsSize,int target){
	int left=0;
	int right=numsSize-1;
	int middle=0;
	while(left<=right){
		middle=left+(right-letf)/2;
		if(nums[middle]==target){
			return middle;
		}else if(nums[middle]>target){
			right=middle-1;
		}else{
			left=middle+1;
		}
		}
		return -1;
		}

1.对上述的代码当检查区间是 左闭右闭区间 [left, right] 是由于区间内包含左右双指针所指向的元素,所以判断条 left==right 时,搜索区间是 [left, right] ,这个区间依然有一个元素所以要进行检查,查看这一个元素符不符合目标条件。
2.如果 nums[middle] > target 表示这 target 不在包含 nums[middle] 的位置,况且是闭区间所以 middle 处的值比 target 大,所以 target 应该在 [left, middle - 1] 这个范围里。
3.当 nums[middle] < target 时说明目标元素 target 在当前搜索范围的右半部分。因为 nums[middle] 已经被检查过且比 target 小,所以我们将 left 更新为 middle + 1,这样新的搜索范围变成 [middle + 1, right]
同样,middle 位置的元素已经不符合要求,将其从搜索范围中移除,缩小搜索范围。

2. 左闭右开区间 [left, right)

在二分查找算法中,使用左闭右开区间 [left, right) 表示搜索范围时,意味着搜索范围包含左边界 left 所指向的元素,但不包含右边界 right 所指向的元素。
left 表示搜索范围的起始索引,该位置的元素包含在搜索范围内。而 right 表示搜索范围的结束索引,但该位置的元素不在当前的搜索范围之内。

#include<#include>

int binarySearch(int* nums, int numsSize, int target) {
    int left = 0;
    int right = numsSize;
    int middle = 0;
    while (left < right) {
        middle = left + (right - left) / 2;
        if (nums[middle] == target) {
            return middle;
        } else if (nums[middle] > target) {
            right = middle;
        } else {
            left = middle + 1;
        }
    }
    return -1;
}

1.while (left < right)left 等于 right 时,搜索范围是 [left, right),这个区间是空集,因为不包含 right 处的元素,所以无需检查,循环结束。
2.如果 nums[middle] > target 表示这 target 目标元素在 [left, middle) 范围内 的位置,由于 right 是开区间端点,将 right 更新为 middle,新的搜索范围变成 [left, middle),排除了 middle 元素。
3.当 nums[middle] 小于 target 时,说明目标元素在 [middle + 1, right) 范围内。
因此将 left 更新为 middle + 1,排除了 middle 元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值