今天的学习内容是(二分查找)
相信大家看见这个问题时,会轻易的想出对应的代码块吧。用for循环找出那个指定值,但这种方法效率不高,今天就来说说二分查找的方法。
假如你猜别人的鞋子是多少钱,别人说100~300,那你是不是会先猜一个200,他会说太小或者太大了,然后你就再从之间猜一个中间数,直到猜中。每次猜一次,就重新规定一个新的范围,是不是就会减少一半,这效率高吧。
那么应用到这道题中,第一个数和最后一个数是不是就是它的范围呢。
如图所示:
middle = (left+right)/2;
此时我们目标值比middle大,那我们接下来就会将范围改变
将left移到middle的右边一位:left = middle + 1;
此时恰好我们的middle = 目标数 ,比较巧哈。
如果我们的目标数比middle小的话,此时我们将移动right的位置,移到middle的左边一位:
right = middle-1:
注意:每找一次,middle的位置也会相应改变的。
接下来我们就来看代码咯
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr[] = { 3,9,7,13,15,17,18,19,12,20 };
int j = 19;
int i = 0;
int a = sizeof(arr) / sizeof(arr[0]);//求出数组的元素个数
int left = 0;
int right = a - 1;
while (left <= right)//当left<right时,说明中间还有值可找
{
int middle = (left + right) / 2;
if (j < arr[middle])
{
right = middle - 1;//改变right的位置
}
else if (j > arr[middle])
{
left = middle + 1;//改变left的位置
}
else
{
printf("找到了,下标是:%d\n", middle);
break;//找到了就跳出循环,不然会重复打印
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
结果展示:
你GET到其中的点了吗?如果有问题,可以提出来哦,或者我说的不对的地方。
加油,每天进步一点点!
注意哦,只是在有序数组中哦