简单讲解二分查找法查找数组下标:
首先,创建一个大小为10的数组,定义一个左下标,还有右下标,要查找的数字k,还有中间的下标
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = sizeof(a) / sizeof(a[0]) - 1;
int i,k=0,mid=0;
所谓二分法,就是不断细分。因此,我们需要用到循环来不断细分,最后达到最终目标。
当我们查找“8”这个数字时,给k赋值8。进入循环中,对左右下标不断细分,从而知道8所在的位置。
核心代码:
while (left <= right) {
mid = (left + right) / 2;
if (k>a[mid]) {
left = mid + 1;
}
else if (k<a[mid]) {
right = mid - 1;
}
else {
break;
}
}
if (left <= right) {
printf("找到了!下标是:%d", mid);
}
else {
printf("没找到!\n");
}
图解:
第二次循环:
第n次循环:
整体思路就是这样子,通过对左右下标的移动,更新中间下标,得到要查找的下标,退出循环。
源代码:
#include<stdio.h>
int main(){
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = sizeof(a) / sizeof(a[0]) - 1;
int i,k=0,mid=0;
for (i = 0; i < sizeof(a) / sizeof(a[0]) - 1; i++) {
printf("%d ", a[i]);
}
printf("\n请输入要查找的数字\n");
scanf("%d", &k);
while (left <= right) {
mid = (left + right) / 2;
if (k>a[mid]) {
left = mid + 1;
}
else if (k<a[mid]) {
right = mid - 1;
}
else {
break;
}
}
if (left <= right) {
printf("找到了!下标是:%d", mid);
}
else {
printf("没找到!\n");
}
return 0;
}//二分查找法
代码实现: