思路:
1. 找到数组的中间位置
2. 检测中间位置的数据是否与要查找的数据k相等
a: 相等,找到,打印下标,跳出循环
b: k < arr[mid], 则key可能在arr[mid]的左半侧,继续到左半侧进行二分查找
c: k > arr[mid], 则key可能在arr[mid]的右半侧,继续到右半侧进行二分查找
3. 如果找到了,返回下标,否则继续;直到区间中没有元素时,说明数组中没有k,打印“没找到”
易错点:
1. right的右半侧区间取值,该值决定了后序的写法
2. while循环的条件是否有等号
3. 求中间位置的方法,直接相加除2容易造成溢出
4. 更改left和right的边界时,不确定是否要+1和-1
写法一:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,5,6,8,9,10,11 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;//right位置的数据可以取到
int k = 0;
scanf("%d", &k);
while (left <= right) //right位置的数据可以取到,加=
{
int mid = left + (right - left) / 2; //不直接相加除2,防止溢出
if (arr[mid] == k)
{
printf("找到了,下标为%d\n", mid);
break;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
if (left > right)
{
printf("没找到\n");
}
return 0;
}
写法二
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,5,6,8,9,10,11 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]);//right位置的数据取不到
int k = 0;
scanf("%d", &k);
while (left < right) //right位置没有数据,此处不需要添加=
{
int mid = left + (right - left) / 2;
if (arr[mid] == k)
{
printf("找到了,下标为%d\n", mid);
break;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
right = mid;//right位置的数据取不到,因此right=mid,不需要减1
}
}
if (left == right)
{
printf("没找到\n");
}
return 0;
}