C语言来实现折半查找(二分查找)超详细思路讲解

​二分查找是一种效率较高的查找方式,但是仅仅限于在有序排列的元素中使用

折半查找法也称为二分查找法,它的基本思想是,将元素先分成两半(假设有n个元素)n/2,将n/2与要找的数字进行比较,如果正好等于要查找的数字,那么程序结束,如果n/2大于要找的目标数字,那么接下来只需要在元素的左边进行查找(0~n/2)

循环上述的部分,直到找到目标数字,程序结束,然后输出找到数字

那么接下我们来详细的解说一下折半查找的过程

假设我们创建了一个数组 

int arr[10] = {1,2,3,4,5,6,7,8,9,10};

我们首先要做的就是先找到那个中间元素,后期中间元素还要符合我们的要求去进行变动,所以我们可以先定义两个下标,left和right

int left  = 0;//左下标

int right = sizeof(arr) / sizeof(arr[0]) - 1;//右下标--元素个数减一

int mid = (left + right) / 2;//中间元素下标

接下来我们只需要将要找的数字与中间元素进行比较,我们假设要找的n = 8

因为arr[mid] < n;

所以left = left + 1;//直接pase掉左边的数字1,2,3,4,5

然后重新求得中间元素的下标mid =  (left + right) / 2;

再用新求得的中间元素与n进行一个比较

............

循环上述步骤,直到找出我们的n,然后循环结束

最后我们要考虑的一个问题就是,循环结束的条件是什么,我们可以想一下,在我们找到目标元素之前我们的left是一直小于right的(也有可能等于),那么当我们找到目标元素之后,left++(或者right--)之后,我们的left就会大于我们的right,此时循环就要结束了,所以我们循环体的条件可以是left <= right(不满足这个条件就会退出)

最后一步就是输出我们的目标元素或者元素下标了

具体代码实现:

#include <stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);//数组的元素个数
	int left = 0;//左下标
	int right = sz - 1;//右下标
    
    //输入要找的数字
	int n = 0;
	printf("请输入一个1-9的数字:\n");
	scanf("%d", &n);

	while (left <= right)
	{
		int mid = (left + right) / 2;//确定中间值
		if (arr[mid] < n)
		{
			left = mid + 1;
		}
		else if (arr[mid] > n)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了下标是%d", mid);
			break;//找到之后break直接跳出循环
		}
	}
	if (left > right)
	{
		printf("找不到\n");
	}
	return 0;
}

活动地址:CSDN21天学习挑战赛

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南山忆874

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

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

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

打赏作者

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

抵扣说明:

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

余额充值