每一道题会有不一样的收获!
题目:编写程序在有序数组中找到目标数字。
思考点1:二分法的思考逻辑?
思考点2:循环的结束条件是什么?
当遍历数组后依然没有找到目标数,则left>right。因此遍历的条件为left<=right。
#include<stdio.h>
int main()
{
int k = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//数值一定要有序
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
scanf("%d", &k);//输入要找的数
while (left <= right)//左不能大于右
{
int mid = left + (right - left) / 2;// <===>(left+right)/2
//这样写可以防止求中间值时数值超出范围导致结果偏差
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标是%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
值得注意的是:
在求mid中间值时写成:int mid = left + (right - left),当两个数值位数超过亿位时,可以防止求中间值时数值超出范围导致结果偏差。
如图:假设要将两个台阶改成一样高,可以用割补法。因此求该中间值时也借助该方法。