C语言中经典查找下标问题——二分查找法

当我们想在一串数组中查找某个数对应的下标时,我们首先能想到的办法是从第一个开始,挨着往后去查找。(这里我们默认为递增数组,也可以先排序成递增数组)

但是这样的话需要花费的时间很多,于是我们就想有没有简单又没那么耗时的办法呢?

当然是有的,那就是我们的二分查找法。

二分查找法可以这样来理解:

小明告诉小红自己今天买了一双鞋,价格在1-100之间,让小红猜这双鞋的价格。

我们不会从1开始猜吧,我们一般都是从中间50开始猜。

小红说:“50。”

小明说:“猜小了”

然后范围就变成50-100了

小红又说:“75”

小明说:“猜大了”

于是范围又变成了50-75,就这样以此类推,直到最终猜到正确的价格。

那这个就和我们需要的查找下标是一样的道理,明白了之后我们就一起来写代码吧!

首先我们先写出数组,这里默认为升序

然后我们要查找中间值我们肯定需要知道这个数组的的长度来计算中间值,于是我们用到了sizeof来计算长度,用整个数组的长度来除数组第一个数的长度(4个字节),来求出整个数组的长度。

接下来是左右下标。注意这里的右下标为长度减一!

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//计算长度  strlen计算是不包含\0的
	int left = 0;
	int right = sz - 1;
	printf("请输入一个数:");
		scanf("%d", &i);

 现在就是书写我们需要查找的值和中间值大小的比较了

在这里我们将中间坐标设为mid,中间值为arr[mid]

将它与我们要查找的数 i 来做比较

如果中间值在i的左边,那么证明中间值比i小了,这时候我们就要缩小范围,将左下标的值变成中间值的坐标+1——>left=mid+1  同理,当中间值在i的右边时,那么就要将右下标的值变成中间值-1——>right=mid-1

在这里还有一点注意的是计算数组长度的时候我们可以用(left+right)/2来计算,但这个不好的点在于可能会报错,如果我的left+right的值超过了最大值,系统就会报错。

所以在这里我们采用left+(right-left)/2是最好的

每次都要进行这样的判断,我们就想用循环来进行这样的判断。

while (left <= right)
		{
			int mid = (left + right) / 2;
			//int mid=left+(right-left)/2  防止报错数字过大
			if (arr[mid] < i)
			{
				left = mid + 1;
			}
			else if (arr[mid] > i)
			{
				right = mid - 1;
			}
			else
			{
				printf("找到了下标为:%d", mid);
				break;
			}
			if(left>right)
				printf("找不到");
        }

 当我们的中间值和我们要找的i值一样时,那我们就找到了,并且输出下标。

完整代码是这样的:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//计算长度  strlen计算是不包含\0的
	int left = 0;
	int right = sz - 1;
	printf("请输入一个数:");
		scanf("%d", &i);
		while (left <= right)
		{
			int mid = (left + right) / 2;
			//int mid=left+(right-left)/2  防止报错数字过大
			if (arr[mid] < i)
			{
				left = mid + 1;
			}
			else if (arr[mid] > i)
			{
				right = mid - 1;
			}
			else
			{
				printf("找到了下标为:%d", mid);
				break;
			}
			if(left>right)
				printf("找不到");
        }
		
	return 0;
}

让我们测试一下,比如我们要找数字7和数字14

数字7:

 数字14:

 这样就解决了我们的问题。

如果对你解决问题有帮助的话,点个赞再走吧~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二分查找,也叫折半查找,是一种在有序查找某一特定元素的搜索算。其基本思想是:每次取间位置的值与目标值进行比较,如果间位置的值比目标值大,则在组的左半部分继续查找,如果间位置的值比目标值小,则在组的右半部分继续查找,直到查找到目标值或者组被查找完毕。 下面是 C 语言的二分查找实现: ```c #include<stdio.h> int binary_search(int arr[], int n, int target) { int left = 0, right = n - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; // 没有找到目标元素 } int main() { int arr[] = {1, 3, 5, 7, 9, 11}; int n = sizeof(arr) / sizeof(int); int target = 7; int index = binary_search(arr, n, target); if (index != -1) { printf("%d 找到了,下标是 %d\n", target, index); } else { printf("%d 没有找到!\n", target); } return 0; } ``` 运行结果为: ``` 7 找到了,下标是 3 ``` 上述代码,`binary_search` 函用于实现二分查找,其 `arr` 是有序组,`n` 是组的长度,`target` 是要查找的目标元素。函返回值为目标元素在下标,如果没有找到目标元素,则返回 `-1`。 在 `main` 函,我们定义了一个有序组 `arr` 和目标元素 `target`,然后调用 `binary_search` 函进行查找。如果找到了目标元素,则输出它在下标,否则输出没有找到的提示信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值