一、题目要求
在一个有序数组中,查找某一个数字,如果能找到,则输出它的下标,如果找不到,输出该数字不存在。
二、解题思路
有一种简单的方法是遍历整个数组,但是这种方法的时间复杂度较高,且逼格不够高。所以我们采用一种较为高级的方法。
二分法,顾名思义,就是把数组分成两部分,每次都分成两部分,这样一下子就能缩小一半的范围。为了便于大家理解,这里我举个栗子:你买了一杯饮料,并且说价格在20之内。让我猜多少钱,那我肯定会先猜10元,然后你说猜低了,那我就会再猜15元,这时你又说猜高了,那我就会猜12元,然后再问几次,这时就可以猜出饮料的价格了。这种从中间折半猜价格的方法就是二分法。
画个图便于大家理解:
粉色的数字⭕️1,代表第一次猜的价格,
粉色的数字⭕️2,代表第二次猜的价格,
粉色的数字⭕️3,代表第三次猜的价格,
在图里可以发现,范围是一半的在缩小,二分法也是这样的原理。
三、代码解题
#include <stdio.h>
int main()
{
int input = 0; //初始化要查找的数字
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//创建一个有序数组
printf("请输入你要查找的数字->");
scanf("%d", &input);
int sz= sizeof(arr) / sizeof(arr[0]);//sz是数组的长度
//sizeof这个函数是用来求数组的长度的,单位是字节。
//sizeoff(arr)求出这个数组的总长度,sizeoff(arr【0】)求出一个字符的长度
//总长度/一个字符的长度 ,求出这个数组有多少个元素
int left = 0; //left是最左边元素的下标
int right = sz-1;//right是最右边元素的下标,因为数组元素是从0开始,所以要减1
while (right >= left)
{
int mid = ((right + left) / 2); //mid是中间元素的下标
if (input > arr[mid])
{
left = mid + 1;//如果要查找的数字比中间数字大,比如要在1-10之间查找7,
//7比中间元素5大,那么就要右边的范围,原本最右边的元素不变,原本的
//中间元素加1,变成新的左边元素,这样就确定了新的范围
}
else if (input < arr[mid])
{
right = mid - 1;
//如果要查找的数字比中间数字小,比如要在1-10之间查找3,
//3比中间元素5小,那么就要左边的范围,原本最左边的元素不变,原本的
//中间元素减1,变成新的右边元素,这样就确定了新的范围
}
else
{
printf("下标是:%d\n", mid);//除了上述两种情况,只剩下要查找数字等于中间元素,
//那么中间元素的下标就是要找的数字的下标
break;
}
}
if (right < left)
printf("不存在");
return 0;
}
四、其他
如果有什么不明白的地方在下方评论,欢迎指正。