二分查找(折半查找)

       如果在一个升序的数组中,查找指定的数字n,很容易想到的方法是遍历数组,但这种方法的效率比较低,假如这个数组很大,就比较浪费时间。那有什么方法能够快速的找到这个数字呢,现在我就教大家一种方法,叫二分查找

原理:二分查找的原理其实就是折半,如果要查找的数小于数组的中间数,则数组的中间数右边的所有数自然都不是要找的数,如果查找的数大于数组的中间数,则中间数左边的所有数也都不是要找到数。

这样一折半,就去掉了大半的数字,找到目标数便更加轻松了。

但使用这个方法有一个重要的前提:是在一个升序的数列中可不要用错了哟! 

 既然我们已经了解了二分查找的原理以及使用环境,接下来就开始代码的实现吧!

 

#include<stio.h>
​
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//假如数组中有这样十个元素
	int a = 5;//假设查找的目标数为5
	int len = sizeof(arr) / sizeof(arr[0]);//这里是计算出数组中的元素个数,如果不懂sizeof的用法的话,可见博主个人主页的第二篇文章,有讲哦
	int left = 0;//定义左下标
	int right = len - 1;定义右下标
	int flag = 0;
//在不断更新左下标和右下标,以及中间数的过程中,很明显是一个循环的过程,所以我们写一个while循环
	while (left <= right)
	{
		int avg = (left + right) / 2;//数组的中间数
		if (arr[avg] < a)
		{
			left = avg + 1;//更新左下标
		}
		else if (arr[avg] > a)
		{
			right = avg - 1;//更新右下标
		}
		else
		{
			flag = 1;
				printf("找到了,下标为%d\n",avg);
				break;//如找到,跳出循环
		}
	}
	if (flag == 0)
		printf("找不到\n");
	return 0;
}

​

 


在数组中,我们一般用数组的下标来确定数组中的元素,所以在找数组的中间数时,我们同样用下标来确定。 当然,在一般情况下我们不能在一次折半中就能找到我们的目标数,所以我们需要多次折半,如此一来,数组中的左右下标和中间数是在更新的,左下标加1,右下标减1。


循环的条件: 在左右下标的更新中,数组的范围在不断缩小,所以只有left<=right才有值可找

运行结果: 


 

 这是本人对二分查找的理解,希望能帮到大家,如出现了错误,欢迎各位在评论区指正,谢谢!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值