在一个有序数组中查找具体的某个数字

今天的学习内容是(二分查找)

相信大家看见这个问题时,会轻易的想出对应的代码块吧。用for循环找出那个指定值,但这种方法效率不高,今天就来说说二分查找的方法。

假如你猜别人的鞋子是多少钱,别人说100~300,那你是不是会先猜一个200,他会说太小或者太大了,然后你就再从之间猜一个中间数,直到猜中。每次猜一次,就重新规定一个新的范围,是不是就会减少一半,这效率高吧。

那么应用到这道题中,第一个数和最后一个数是不是就是它的范围呢。

如图所示:

 middle = (left+right)/2;

此时我们目标值比middle大,那我们接下来就会将范围改变

left移到middle的右边一位:left = middle + 1;

此时恰好我们的middle = 目标数 ,比较巧哈。

如果我们的目标数比middle小的话,此时我们将移动right的位置,移到middle的左边一位:

right = middle-1:

注意:每找一次,middle的位置也会相应改变的。

接下来我们就来看代码咯

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int arr[] = { 3,9,7,13,15,17,18,19,12,20 };
	int j = 19;
	int i = 0;
	
	int a = sizeof(arr) / sizeof(arr[0]);//求出数组的元素个数
	int left = 0;
	int right = a - 1;
	
	
	while (left <= right)//当left<right时,说明中间还有值可找
	{
		int middle = (left + right) / 2;
		if (j < arr[middle])
		{
			right = middle - 1;//改变right的位置
		}
		else if (j > arr[middle])
		{
			left = middle + 1;//改变left的位置
		}
		else
		{
			printf("找到了,下标是:%d\n", middle);
			break;//找到了就跳出循环,不然会重复打印
		}
	}
        if (left > right)
        {
    	    printf("找不到\n");
        }
		return 0;
	}

结果展示:

你GET到其中的点了吗?如果有问题,可以提出来哦,或者我说的不对的地方。

 加油,每天进步一点点!

 注意哦,只是在有序数组中哦

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

并不会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值