##首先找到目标数组的最小下标和最大下标
int left = 0; //最小下标即为0
int right = sizeof(data) / sizeof(data[0]) - 1; //求出最大下标 因为sizeof是用来求一个对象(类型,变量,……)所占的内存大小(以字节为单位)。 sizeof(data)求出的是整个数组所占内存大小, sizeof(data[0])是数组中的一个元素所占的内存大小, sizeof(data) / sizeof(data[0])即为数组的长度,数组长度-1即为数组最大下标(别忘了数组下标是从0开始计的).
有了最小下标和最大下标后就可以得出数组中间元素的下标值 即mid = (left + right) / 2,再将要查找的值X与data[mid]比较 ,
如果X>data[mid],将最小坐标更新为mid+1,然后得到新区间【mid+1,right】,再得到一个新的mid,再继续比较X与data[mid]
如果X<data[mid],将最大坐标更新为mid+1,然后得到新区间【left,mid+1】,再得到一个新mid,再继续比较X与data[mid]
如果X=data[mid],就是找到了,就用break 退出循环
循环以上过程,循环条件为left<=right,即只要每次得到的新区间存在,就找出新的mid进行X与data[mid]的比较,当left=right时,就是比较最后一个data[mid]的时候
退出循环后,继续用(left<=right)做一个判断,如果成立则是找到了,如果不成立那就是循环完毕还没出现X=data[mid],即就是目标数组中没有要查找的数。
完整代码如下
#include <stdio.h>
int main(void) {
int data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int toCheck = 0;
int left = 0;
int mid=0;
int right = sizeof(data) / sizeof(data[0]) - 1;
scanf("%d", &toCheck);
while (left <= right) {
mid = (left + right) / 2;
if (toCheck < data[mid]) {
right = mid - 1;
} else if (toCheck > data[mid]) {
left = mid + 1;
} else
break;
}
if(left<=right){
printf("找到了,下标是:%d",mid);
} else
printf("没找到");
return 0;
}