C语言实现二分法查找某个数字(超详细)

一、题目要求

在一个有序数组中,查找某一个数字,如果能找到,则输出它的下标,如果找不到,输出该数字不存在。

二、解题思路

有一种简单的方法是遍历整个数组,但是这种方法的时间复杂度较高,且逼格不够高。所以我们采用一种较为高级的方法。

二分法,顾名思义,就是把数组分成两部分,每次都分成两部分,这样一下子就能缩小一半的范围。为了便于大家理解,这里我举个栗子:你买了一杯饮料,并且说价格在20之内。让我猜多少钱,那我肯定会先猜10元,然后你说猜低了,那我就会再猜15元,这时你又说猜高了,那我就会猜12元,然后再问几次,这时就可以猜出饮料的价格了。这种从中间折半猜价格的方法就是二分法。

画个图便于大家理解:

 粉色的数字⭕️1,代表第一次猜的价格,

 粉色的数字⭕️2,代表第二次猜的价格,

 粉色的数字⭕️3,代表第三次猜的价格,

在图里可以发现,范围是一半的在缩小,二分法也是这样的原理。

三、代码解题

#include <stdio.h>
int main()
{
    int input = 0;              //初始化要查找的数字
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//创建一个有序数组
 	printf("请输入你要查找的数字->");
 	scanf("%d", &input);
 	int sz= sizeof(arr) / sizeof(arr[0]);//sz是数组的长度
    //sizeof这个函数是用来求数组的长度的,单位是字节。
    //sizeoff(arr)求出这个数组的总长度,sizeoff(arr【0】)求出一个字符的长度
    //总长度/一个字符的长度 ,求出这个数组有多少个元素

 	int left = 0;    //left是最左边元素的下标
 	int right = sz-1;//right是最右边元素的下标,因为数组元素是从0开始,所以要减1
 	
 	while (right >= left)
	{
 		int mid = ((right + left) / 2);  //mid是中间元素的下标
 		if (input > arr[mid])
 		{
 			left = mid + 1;//如果要查找的数字比中间数字大,比如要在1-10之间查找7,
                           //7比中间元素5大,那么就要右边的范围,原本最右边的元素不变,原本的
                           //中间元素加1,变成新的左边元素,这样就确定了新的范围
 		}
 		else if (input < arr[mid])
 		{
 			right = mid - 1;
                           //如果要查找的数字比中间数字小,比如要在1-10之间查找3,
                           //3比中间元素5小,那么就要左边的范围,原本最左边的元素不变,原本的
                           //中间元素减1,变成新的右边元素,这样就确定了新的范围

 		}
 		else
		{
			printf("下标是:%d\n", mid);//除了上述两种情况,只剩下要查找数字等于中间元素,
                                        //那么中间元素的下标就是要找的数字的下标
			break;
        }
 	}
	if (right < left)
	printf("不存在");
	return 0;
 }

四、其他

如果有什么不明白的地方在下方评论,欢迎指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值