如果在一个升序的数组中,查找指定的数字n,很容易想到的方法是遍历数组,但这种方法的效率比较低,假如这个数组很大,就比较浪费时间。那有什么方法能够快速的找到这个数字呢,现在我就教大家一种方法,叫二分查找。
原理:二分查找的原理其实就是折半,如果要查找的数小于数组的中间数,则数组的中间数右边的所有数自然都不是要找的数,如果查找的数大于数组的中间数,则中间数左边的所有数也都不是要找到数。
这样一折半,就去掉了大半的数字,找到目标数便更加轻松了。
但使用这个方法有一个重要的前提:是在一个升序的数列中,可不要用错了哟!
既然我们已经了解了二分查找的原理以及使用环境,接下来就开始代码的实现吧!
#include<stio.h>
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//假如数组中有这样十个元素
int a = 5;//假设查找的目标数为5
int len = sizeof(arr) / sizeof(arr[0]);//这里是计算出数组中的元素个数,如果不懂sizeof的用法的话,可见博主个人主页的第二篇文章,有讲哦
int left = 0;//定义左下标
int right = len - 1;定义右下标
int flag = 0;
//在不断更新左下标和右下标,以及中间数的过程中,很明显是一个循环的过程,所以我们写一个while循环
while (left <= right)
{
int avg = (left + right) / 2;//数组的中间数
if (arr[avg] < a)
{
left = avg + 1;//更新左下标
}
else if (arr[avg] > a)
{
right = avg - 1;//更新右下标
}
else
{
flag = 1;
printf("找到了,下标为%d\n",avg);
break;//如找到,跳出循环
}
}
if (flag == 0)
printf("找不到\n");
return 0;
}
在数组中,我们一般用数组的下标来确定数组中的元素,所以在找数组的中间数时,我们同样用下标来确定。 当然,在一般情况下我们不能在一次折半中就能找到我们的目标数,所以我们需要多次折半,如此一来,数组中的左右下标和中间数是在更新的,左下标加1,右下标减1。
循环的条件: 在左右下标的更新中,数组的范围在不断缩小,所以只有left<=right才有值可找
运行结果:
这是本人对二分查找的理解,希望能帮到大家,如出现了错误,欢迎各位在评论区指正,谢谢!!!