【C语言】二分法查找——————细节讲解

  • 概念

二分法查找,是一种在有序数组中快速目标数字的一种算法,也可以叫做折半查找。

要掌握二分法查找,首先我们要明白二分法查找是怎么运作的,为什么要用二分法查找。

在这里插入图片描述

  • 这里有一个数组,共有十个元素,我们想找到其中一个元素,按照传统遍历的办法,我们写一个循环那么最多要循环十次,但是如果我们用二分法查找的话最多只用4次循环就可以做到。
    传统办法代码示例:
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };//定义数组
	int n = 0;
	scanf("%d", &n);//输入要查找的数字
	for (int i = 0; i < 10; i++)//从头到尾遍历查找
	{
		if (arr[i] == n) 
		{
			printf("找到了,位置在下标%d", i);
			break;
		}
	}

二分法查找讲解

在这里插入图片描述
二分法查找的精髓就是如果没查询到,下次将数据折半再进行查找,大大提高效率,,那么如果想砍掉一半数据,最重要的就是找到中间的数字,比如下图,我们想找的是2,那么我们先拿到中间数字5与2进行比较,5比2大,所以要找的肯定不是5右面的数(因为是有序数组),所以将5右面的数包括5一起pass掉
在这里插入图片描述
接下来我们继续在下标0-3的数字上进行查找中间数字为2,查找成功。

  • 对于定位中间数,我们可以采用 最大的下标+最小的下标/2

于是便有了二分法查找必不可少的三个变量
left始化为0,因为最小的下标肯定是0
right ,sizeof(arr) / sizeof(arr[0]) - 1
mid ,(left + right) / 2,其中left和right的存在都是为了找出mid

  • 有了这三个变量,问题就变得简单了,只要每次折半后修改left或者right的位置,然后产生新的mid,二分法查找就写好了
#include <stdio.h>

int main()
{
	int arr[10] = { 11,22,33,44,55,66,77,88,99,101 };//定义要查找的数组
	int sz = sizeof(arr) / sizeof(arr[0]);//数组大小
	int left = 0; //关键变量left用于定位范围左边
	int right = sz - 1;//关键变量right用于定位范围右面
	int mid = left + (right - left) / 2;//关键变量mid用于定位范围中间
	int input = 0;
	int flag = 0;//标记循环结束后是否找到数字
	scanf("%d", &input);//输入要查找的数字
	while (left <= right)
	{
		if (input > arr[mid])//如果要查找的数字大于中间数,砍掉左半边
		{
			left = mid + 1;//将左范围更正到原mid右一位
			mid = left + (right - left) / 2;//将范围中间数更新
		}
		else if(input <arr[mid])//如果要查找的书数字小于中间数,砍掉右半边
		{
			right = mid - 1;//更新右范围为原mid左一位
			mid = left + (right - left) / 2;//将范围中间数更新
		}
		else//如果既不大于也不小于,则为等于,找到数字		
		{
			flag = 1;//将标记改为1
			printf("找到了坐标为%d",mid);
			break;//跳出程序
		}
	}
	if (flag == 0)//如果标记在循环中没有被修改,则证明没找到
	{
		printf("没找到");
	}
}

总结

二分法查找其实很简单,主要就是找到中间数,每次进行折半即可。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EXSYx5O-1677661166102)(https://img-home.csdnimg.cn/images/20220524100510.png =60x60)]

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值