1 #include <iostream>
2 using namespace std;
3 int a[] = {1,3,5,7,9,13,18,22,37,45,51,62,77,89,93}, x;
4 int main() {
5 cin >> x;
6 int left = 0, right = 15, mid, p = -1, count = 0;
7 while (left < right) {
8 mid = (left + right - 1) / 2;
9 count++;
10 if (a[mid] == x) {
11 p = mid;
12 break;
13 }
14 else if (a[mid] < x)
15 left = mid + 1;
16 else
17 right = mid;
18 }
19 cout << p << endl;
20 cout << count << endl;
21 return 0;
22 }
本程序使用二分查找算法寻找 $x$ 在数组 $a$ 中对应的下标 $p$(若 $x$ 在数组中不存在则 $p=-1$),同时使用 $count$ 记录二分查找的次数。
1. 错误。解析:变量 $x$ 并不对应数组下标,所以 $x$ 的值并不会造成数组越界。
2. 正确。解析:因为 $p$ 对应数组 $a$ 的下标,所以若找到 $a[p]==x$,则 $p$ 的值介于 $0 \sim 14$ 范围内,若没有找到,则 $p=-1$,所以 $p$ 的值不会超过 $14$。
3. 正确。解析:变量 $count$ 的值对应二分查找的次数,对于长度为 $15$ 的数组 $a$,二分查找的次数不会超过 $⌈log_215⌉=4$。
4. C。解析:$a[2]==5$。
5. A。解析:$a$ 数组中不存在任何一个元素等于 $12$,所以输出的第一行为 $-1$。
6. D。解析:一共二分查找了 $4$ 次,对应的 $mid$ 及 $a[mid]$ 分别为 $a[7]=22,a[11]=62,a[9]=45,a[8]=37$。