这篇博客给兄弟们分享一波二分查找法,二分查找法也叫做折半查找法。
应用场景:
在有序数组(按从小到大规律排列的数组)当中查找某个给定的数字
如何实现:
创建一个整型数组 arr
具体数值 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
此时我们需要用到三个变量
1.left用于表示数组的左范围
2.right用于表示数组的右范围
3.mid用于表示左右范围的中间值(也可以表示为被寻找数字下标)
例:我们需要再arr这个整型有序数组当中寻找 数字6
第一次寻找如下
首先 我们拿 arr[mid]中元素的值 跟被寻找数字(被寻数)6作比较
此时 arr[mid] = arr[4] = 8 8与被寻数比较 是否相等 若是相等 则找到了
若是不相等,则进行第二次寻找
第二次查找 首先要将查找范围缩小
在这个例子中 被寻数=6 是小于 arr[mid]=8 的
又因为该数组为有序数组
所以可以判断出 被寻数 肯定不在大于 arr[mid] 的那一边
由以上判断以后 我们就可以进行缩小范围的操作了
此时 比 arr[mid] 大的那一部分在数组的右边
所以,我们可以把数组的右范围缩小
即 right=mid-1
此时 arr[mid] = arr[1] = 5 与被寻数 6 比较 是否相等 若是相等 则找到了
若不相等,则进行第三次寻找
与第二次寻找同理
直接上图
此时 arr[mid] = arr[2] = 6 与被寻数 6 比较 是否相等 若是相等 则找到了
可以发现此时的 arr[mid] 是等于 被寻数的
所以,我们就用二分法查找到了该数字
最后在屏幕上输出:找到了,被寻数下标为:mid(2)
理论结束,开始实践
实践代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[10] = { 2,5,6,7,8,9,10,15,16 };
int f = 6;
int left = 0;
int right=(sizeof(arr)/sizeof(arr[0]))-1;
int mid = 0;
while (left<=right)
{
mid = (left + right) / 2;
if(arr[mid]==f)
{
printf("找到了,被寻数下标为:%d", mid);
break;
}
else if (arr[mid]<f)
{
left = mid + 1;
}
else if(arr[mid>f])
{
right = mid - 1;
}
}
if (left > right)
{
printf("找不到");
}
return 0;
}
实践结束
如果对兄弟们有帮助的话
点点赞呀
拜了个拜 下次再见