#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int n = 0;
scanf_s("%d", &n);
int sz = sizeof(arr) / sizeof(arr[0]);
int l = 0;
int r = sz - 1;
while (l<=r)
{
int m = l + (r - l) / 2;
if (arr[m] > n)
{
r = m - 1;
}
else if ( arr[m]<n)
{
l = m + 1;
}
else //不理解,为啥这里不能写成else if(l==r)
{
printf("找到了,下标是:%d\n", m);
break;
}
}
if (l > r)
{
printf("没找到");
}
return 0;
}
在一个有序数组中查找某个数n,//不理解,为啥第三分支的else写成else if(l==r)是错的
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
6条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在您提供的C语言代码中,用于在一个有序数组中查找特定数字
n
的二分查找算法已经基本正确。不过,对于您的疑问,关于为什么在if
和else if
之后的else
分支不能写成else if(l == r)
,这是因为逻辑上在这里不需要再进行判断。在二分查找的过程中,当
l <= r
条件满足时,我们继续执行循环。当arr[m] > n
时,我们将右边界r
调整为m - 1
;当arr[m] < n
时,我们将左边界l
调整为m + 1
。只有当前边界l
与r
相等时,才表示搜索范围已缩小到一个元素,即arr[l]
。此时,我们可以直接判断这个元素是否等于目标值n
,无需额外的条件语句。下面是修改后的代码,去掉了不必要的
else if(l == r)
,并将找到结果的输出移到了while
循环之外,以避免在每次找到时都打印结果:#include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9 }; int n = 0; scanf("%d", &n); int sz = sizeof(arr) / sizeof(arr[0]); int l = 0; int r = sz - 1; while (l <= r) { int m = l + (r - l) / 2; if (arr[m] > n) { r = m - 1; } else if (arr[m] < n) { l = m + 1; } else { printf("找到了,下标是:%d\n", m); break; } } if (l > r) { printf("没找到"); } return 0; }
这段代码会在找到目标值时立即停止搜索并输出结果,如果没有找到,则在循环结束后输出"没找到"。这样就避免了在每次找到时重复打印结果的问题。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 ansys fluent计算闪退
- ¥15 有关wireshark抓包的问题
- ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
- ¥15 向数据表用newid方式插入GUID问题
- ¥15 multisim电路设计
- ¥20 用keil,写代码解决两个问题,用库函数
- ¥50 ID中开关量采样信号通道、以及程序流程的设计
- ¥15 U-Mamba/nnunetv2固定随机数种子
- ¥15 vba使用jmail发送邮件正文里面怎么加图片
- ¥15 vb6.0如何向数据库中添加自动生成的字段数据。