怎么做
  1. 题面里的虚线方框就是要填的空
  2. 点候选项,它会填进当前高亮的那个空
  3. 点已填好的空,可以把选项取回来重选
  4. 全部填满后「提交」才会亮起
卡住了就点右下角的 👩‍🏫 问 AI 老师,她会给提示但不直接给答案。

二分查找每次看哪一个

👁️ 20 人浏览 💬 0 人评论 ❤️ 添加收藏

有序数组里找 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
💬 题目评论
🔒 登录并作答后可看讨论