二分查找法也成为折半查找法,这方法,只可以用在有序的数组中,不能用在无序的数组中。
二分查找可以帮我们很好的查找数组中的任何一个数,简易,浪费时间少。
就比如给个题:比如下面这十个数组中让我们,找7这个数字。
arr[ ] = {1,2,3,4,5,6,7,8,9,10 };
我们先吧大概的思路说一下:
- 我们先把这10个数字的下标表出来
- 最前边下标为left(左下标),最后下标为right(右下标),这两个的平均值作为我们的中间元素的下标
- 最前面的下标和最后面的下标互相加了以后除以2,得到中间元素。
最前面的下标是0,最后面要是不知道,利用这个公式可以找到:
元素个数 sz = sizeof(arr)/ sizeof(arr[0]);
总元素大小(字节)/ 一个元素大小(字节)
10*4 / 4 = 10(个元素)
找到元素个数 以后,10个元素他的右下标肯定9
- 把左下标和右下标加起来除以2后得到的中间元素:(0+9)/2 = 4
- 4作为我们新的下标(把他称为mid),他对应的元素是5,我们本来要找的元素是7,和我们来比较,我们新找出的元素5,5是小于我们要找的7元素,所以说明我们要找的数字7 ,在5的右边。这样我们要查找的变成了6-10.
- 我们的left 就到这儿了。
- 所以我们没必要5的右边找7,所以我们把本来我们定的左下标left移动到5元素对应的下标去。
- 本来我们中间元素下标(mid)是4,这下我们要查的下标范围5(元素是6),所以我们可以这样写:(5 了)left = mid(本来是4) +1,这样我们新的下标就出来了,那就是5,它对应的元素是6。查6-10 这里left 元素是6
- 我们再判断,再把左下标和右下标加起来除以2:(5+9)/2 = 7。我们再把7作为新的mid
- 这样我们的新下标出来了,它对应的元素是8,我们判断8和我们要找的7要大。
- 这说明,我要找的元素mid左边,(8的左边 )
- 这样我们left 不再变,right要变,他变到8的左边,7的下标我们新的right
- 最后我们要找的7 元素是的位置在6-7了
- 这样我们再判断 5和6 了 (5+6)/ 2 = 5 这是我们新的mid,它对应的元素6
- 6是我们要找的7要小,是在6的右边,这样我们要找的元素只能是7了。left 新的小标有了
- 这样我们left 和right 都指向一个7的下标了,刚刚我们做下标是5,right 新下标是6
- 我新的做下标是left = (5)mid +1 = 6 (新下标)
- (6 +6) / 2 = 6 作为新的mid ,对应元素7 ,哎这样我们找到了。
代码示例:
#include<stdio.h>
{
char arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 7;
//查找k
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]);
int mid = (left + right) / 2 ; //中间元素的下标
while(left<=right)
{
if(arr[mid] < k)
{
left = mid + 1;
}
else if(arr[mid] < k)
{
right = mid - 1;
}
else
{
printf("找到了,下标 是:%d\n",mid);
break;
}
}
if(left>right)
{
printf("找不到了\n");
}
return 0;
}