二分查找的理解:
在⼀个升序的数组中查找制定的数字n,我们很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低,
举个栗子,⽐如当朋友买了一件衣服,当你询问价格时,他说不超过300元。你想知道到底多少,当你猜的时候会从1,2,3,4,这样依次往后猜吗,我认为不会,因为这样既不符合实际,也很低效,这种情况下⼀般你都会猜中间数字,⽐如:150,然后看⼤了还是⼩了,这样的查找方法也就是二分查找,也叫折半查找。
所以二分查找就相当于把升序数组每次分成两半来查找,这样每次都可以有一半的数不用遍历,增加了效率。
案例:
在一个升序数组中查找数字n,如果找到了,输出它的下标,如果没有找到,输出没有找到
思路:
如果我们要查找的数存在,分别用left和right,mid存储左右下标和中间数下标,当输入数时,和mid比较,从而确定是向左还是向右继续查找,然后改变left和right的值,重复二分查找,从下图可以看出,当左右下标相同时,即为我们要找的数。
如果我们要查找的数不存在,那么输出结果就和存在不同,为了区分,我们用布尔类型的变量来判断是否找到,当找到时,改变布尔类型的值,从而实现打印不同结果。
而我们循环的条件是判断左右下标的大小,当左下标小于等于右下标时才会进入循环。
注:呜呜,第一次用画图,图不标准,图可能看起来很怪,等我再熟悉一下再重新画
代码实现:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int n = 0;
scanf("%d", &n);
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
int mid = (left + right) / 2;
_Bool find = 0;
while (left<=right)
{
if (n > arr[mid])//所要查找数字在mid右边
{
left = mid + 1;
mid = (left + right) / 2;
}
else if (n < arr[mid])//所要查找数字在mid左边
{
right = mid - 1;
mid = (left + right) / 2;
}
else//索要查找的数刚好等于中间值
{
find = 1;
break;
}
}
if ( find )
{
printf("找到了,该数下标为:%d", mid);
}
else
{
printf("抱歉,没有找到");
}
return 0;
}
输出结果:
以上是本次所有内容,如有错误欢迎各位大佬指正,谢谢。