在一个有序数列中查找一个数(二分查找的讲解)

在一个有序数组中查找元素,找到了就返回下标,没有找到就提示没有找到。

1.常规遍历查找

附带源码大家可以体验效果。

int main()
{
	int len[10] = {1,2,3,4,5,6,7,8,9,10 };
	int input = 0;
	printf("请输入你要查找的数字:\n");
	scanf("%d", &input);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		if (input == len[i])
		{
			printf("找到了,下标是%d\n", i);
			break;
		}
		

	}
	return 0;
}

2.二分查找(折半查找)

为什么要引入这个算法。我们思考一下,如果要查找的数据基数很大呢,比如我们要在一万个数据的基础上去查找的话,是不是就得遍历一万次最坏的情况。

二分查找的思想,对于有序数列,我都可以预先找到它的中间值,左边的数据要么比他大要么都比它小,右边的数据要么都比它小要么都比它大。那么我要查找一个数,只用把这个数和中值做比较,如果要查找的数大于或者小于中间值,是不是就相当于消去了一半的数据。

让我们用图解理解一下。

 附上源码大家可以体验效果。

int main()
{
	int len[] = { 1,2,3,4,5,6,7,8,9,10 };
	int right = sizeof(len)/sizeof(len[0]) - 1;
	int left = 0;
	int mid = 0;
	int key = 0;
	printf("请输入要查找的数字:\n");
	scanf("%d", &key);
	while (left <= right)
	{
		mid = (left + right) / 2;//这里不能使用int mid = ....这样就会把mid定义为局部变量。
		
		if (len[mid] > key)
		{
			right = mid - 1;
		}
		else if (len[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			break;//两个值相等
		}
	}
	if (left <= right)
	{
		printf("找到了,下标是%d\n", mid);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

以上就是今天分享的内容,期待大家的多多指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值