共63道题,当前是第59

Description

1 	#include <bits/stdc++.h>
2 	using namespace std;
3 	const int MAXN = 100;
4 	int arr[MAXN];
5	bool BinarySearch(int n, int target){
6		int left = 0, right = n - 1;
7		while (left <= right){
8			int middle = (left + right) / 2;
9			if (arr[middle] < target) left = middle + 1;
10			else if (target < arr[middle])
11				right = middle - 1;
12			else return true;
13		}
14		return false;
15	}
16	int main(){
17 		int n ,m;	
18		cin >> n;
19		for (int i = 0; i < n; ++i) cin >> arr[i];
20		sort(arr, arr + n); //(1)将arr数组中的元素从小到大排序
21		cin >> m;
22		for (int i = 0; i < m; ++i){
23			int target;
24			cin >> target;
25			if (BinarySearch(n, target))
26				cout << "YES" << endl;
27			else cout << "NO" << endl;
28		}
29		return 0;
30	}

1.    T。代码显然是二分查找。

2.    F。有 left == right 时恰好是关键字所在位置这一情况。

3.    F。如果是从大到小排序,15 行和 17 行的两个 if 语句也要反过来。

4.    A。考察位运算基本知识。

5.    B。每次进循环第一次就找到,所以是总共 m 次。

6.    C。查找序列中是否含有带查询元素。

Question

该算法的时间复杂度是 $O(mlogn)$。(不考虑(1)的排序)( )

将 `while (left <= right)` 改成 `while(left < right)` ,其他地方不做改动,对程序最终的输出结果没有影响。( )

将 `sort(arr, arr + n);` 改成把 $arr$ 数组中的元素从大到小排序的代码,其他地方不做改动,对程序最终的输出结果没有影响。( )

将 `int middle = (left + right) / 2;` 改成下列选项中的哪一项,对于程序的运行没有影响。( )

若给定 $n$ 和 $arr$ 数组,在最好情况下,函数 $BinarySearch$ 中的 $while$ 循环需要被执行( )次。

若输入如下数据:

5

1 5 2 4 3

3

2 5 6

则输出结果为(用空格表示换行):(   )。