二分查找法

      这篇博客给兄弟们分享一波二分查找法,二分查找法也叫做折半查找法。

应用场景:

        在有序数组(按从小到大规律排列的数组)当中查找某个给定的数字

如何实现:

        创建一个整型数组 arr

具体数值256789101516
下标012345678

       

此时我们需要用到三个变量

        1.left用于表示数组的左范围

        2.right用于表示数组的右范围

        3.mid用于表示左右范围的中间值(也可以表示为被寻找数字下标)

例:我们需要再arr这个整型有序数组当中寻找 数字6

第一次寻找如下

首先 我们拿 arr[mid]中元素的值 跟被寻找数字(被寻数)6作比较

 此时 arr[mid] = arr[4] = 8    8与被寻数比较   是否相等  若是相等 则找到了


若是不相等,则进行第二次寻找

第二次查找  首先要将查找范围缩小

在这个例子中   被寻数=6 是小于 arr[mid]=8 的

又因为该数组为有序数组

所以可以判断出 被寻数 肯定不在大于 arr[mid] 的那一边

由以上判断以后 我们就可以进行缩小范围的操作了

此时 比 arr[mid] 大的那一部分在数组的右边

所以,我们可以把数组的右范围缩小

即 right=mid-1

此时 arr[mid] = arr[1] = 5 与被寻数 6 比较 是否相等  若是相等 则找到了


 若不相等,则进行第三次寻找

与第二次寻找同理

直接上图

 此时 arr[mid] = arr[2] = 6 与被寻数 6 比较 是否相等 若是相等 则找到了

可以发现此时的 arr[mid] 是等于 被寻数的

所以,我们就用二分法查找到了该数字

最后在屏幕上输出:找到了,被寻数下标为:mid(2)

理论结束,开始实践


实践代码如下:

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int arr[10] = { 2,5,6,7,8,9,10,15,16 };
	int f = 6;
	int left = 0;
	int right=(sizeof(arr)/sizeof(arr[0]))-1;
	int mid = 0;
	while (left<=right)
	{
		mid = (left + right) / 2;
		if(arr[mid]==f)
		{
			printf("找到了,被寻数下标为:%d", mid);
			break;
		}
		else if (arr[mid]<f) 
		{
			left = mid + 1;
		}
		else if(arr[mid>f])
		{
			right = mid - 1;
		}
	}
	if (left > right)
	{
		printf("找不到");
	}
	return 0;
}

 实践结束


如果对兄弟们有帮助的话

点点赞呀

拜了个拜 下次再见

      

 

  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麗o麗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值