怎么做
- 题面里的虚线方框就是要填的空
- 点候选项,它会填进当前高亮的那个空
- 点已填好的空,可以把选项取回来重选
- 全部填满后「提交」才会亮起
卡住了就点右下角的 👩🏫 问 AI 老师,她会给提示但不直接给答案。
二分查找每次看哪一个
有序数组里找 21:每次看中间那个,扔掉一半
2
5
9
13
17
21
26
mid
13 比 21 小:答案只可能在右边,low = mid + 1
a[mid] == 21:找到了,只比了 2 次
在一个从小到大排好的数组里找 x,可以不必从头一个个看——二分查找:
- 用
low、high记住「x 可能在的范围」,一开始是整个数组; - 每次看正中间
mid = (low + high) / 2:等于 x 就找到了;a[mid]比 x 小,x 只可能在右边,low = mid + 1;比 x 大,high = mid - 1; - 范围每次少一半,
low > high时范围空了,说明没有 x。
#include <stdio.h>
int main(void) {
int a[8] = {3, 8, 15, 21, 30, 42, 57, 66};
int x = 57, low = 0, high = 7, mid, cnt = 0, pos = -1;
while (low <= high) {
mid = (low + high) / 2;
cnt++;
if (a[mid] == x) {
pos = mid;
break;
} else if (a[mid] < x)
low = mid + 1;
else
high = mid - 1;
}
printf("%d %d\n", pos, cnt);
return 0;
}
找 57 时,第 1 次和 x 比较的是【0】,第 2 次是【1】;程序输出【2】。
请登录后作答。
去登录
👩🏫
AI
💬 题目评论
🔒
登录并作答后可看讨论