深耕专业教研,探索前沿技术
信息技术来源:浙江省选考科目考试绍兴市适应性试卷(2026年4月)

第 12 题

答案与解析

本题解析

参考答案

A

解题思路

程序每轮取对分点 m,找到目标后退出,否则把查找区间缩小到 m 的一侧,采用对分查找的结构。题中序列经过循环移动,整体未必升序,需要结合局部的有序关系确定查找方向。

程序分析

i, j = 0, len(a) - 1
ans = -1
while i <= j:
    m = (i + j) // 2
    if a[m] == key:
        ans = m
        break
    ...

i、j 初值分别为首、末元素下标,查找区间覆盖整个序列。每轮计算对分点 m;若 a[m] 等于 key,将 m 存入 ans 并退出。ans 初值为 -1,用于表示尚未找到目标。

if :
    if a[i] <= key < a[m]:
        j = m - 1
    else:
        i = m + 1
else:
    if a[m] < key <= a[j]:
        i = m + 1
    else:
        j = m - 1

空缺条件成立时,后续判断比较 key 与 a[i]、a[m],决定向左还是向右查找;条件不成立时,则比较 key 与 a[m]、a[j]。a[m] 已经检查且未匹配,所以移动边界时都排除下标 m。

填空分析

划线处

循环移动后的序列至多有一处由大变小的断点,因此 a[i…m] 与 a[m…j] 至少有一段升序。只有先确定某一段有序,才能用其首尾值判断 key 是否落在其中。空缺成立时使用左半段的首尾值,所以条件应判断左半段是否升序;否则由右半段的有序关系决定方向。

A

符合要求。元素互不相同,i<m 时,a[i]<a[m] 表明左半段未跨越断点;i=m 时,该段只有一个元素,也应归入这一分支,因此使用 a[i] <= a[m]。

B

不符合要求。它判断右半段是否升序,与 if 分支的检查对象不对应。例如 a=[3,4,5,1,2]、key=1,首轮条件为假,else 内判断也为假,执行 j=1,丢失位于右半段的目标。

C

不符合要求。它漏掉 i=m 的情况。例如 a=[2,1]、key=1,首轮 m=i=0,条件为假;else 内的 2<1 也为假,j 变为 -1,错误结束查找。

D

不符合要求。它判断整个区间是否升序,不能区分断点在哪一半。对 a=[3,4,5,1,2]、key=1,同样会执行 j=1 而丢失目标。