二分查找

二分查找算法的基本思想通俗一点说就是比如猜一个0-100的数,我们一般会从这个范围的最中间的数开始猜,然后根据大了还是小了去缩小范围,继续从下一个范围的中间的数猜,这就是二分查找。

二分查找的前提是数列为有序的数列,否则不适用于二分查找;对于不是有序的数列,我们可以先将其排序,再用二分查找的思想。

算法的代码实现流程如下:
(1)先定义最开始的左下标和右下标,算出初始的中间值mid;
(2)然后将mid与所要寻找的数k进行比较;
(3)如果mid小于k,说明k在中间到最右边的范围内,将左下标改为中间值mid的下一个位置,右下标不变;如果mid大于k,说明k值在最左边到中间的范围内,将右下标改为中间值mid的前一个位置。
(4)在缩小之后的新范围继续计算新的中间值mid,以此类推,直到找到想要的值。

在这个过程中要注意三点:
1.整个查找的过程是一个循环,需要用到while循环,那么循环继续的条件是什么呢?我们知道,要构成新的范围必须有左下标要小于或等于右下标,如果左下标大于右下标的话,说明找遍了整个数列也没有找到想要的数,因此继续循环的条件就是左下标小于等于右下标。
2.找到想要的数的条件就是每次求出来的mid与正确值作比较,相等即为找到。
3.没找到就意味着整个循环结束了也没有得到想要的结果,因此只要与while循环的判断条件相反即为没有找到,也就是左下标大于右下标。

代码实现:

int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int left = 0;
	int right = sizeof(arr)/sizeof(arr[0])-1;
	int key = 7;
	int mid = 0;
	while(left<=right)
	{
		mid = (left+right)/2;
		if(arr[mid]>key)
		{
		right = mid-1;
		}
		else if(arr[mid] < key)
		{
		left = mid+1;
		}
		else
		{
		printf("找到了,下标是%d\n", mid);
		}
	}
	if(left > right)
		printf("找不到\n");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值