知识点:
知道什么是顺序查找,什么是二分查找,知道判定树,知道二分查找的最大比较次数是
单选题:
2-1已知一个长度为16的顺序表L,其元素按关键字有序排列。若采用二分查找法查找一个L中不存在的元素,则关键字的比较次数最多是: (2分)
- 4
- 5
- 6
- 7
解析:根据上面的公式我们知道第二个是对的。
2-2用二分查找从100个有序整数中查找某数,最坏情况下需要比较的次数是:(2分)
- 7
- 10
- 50
- 99
解析:同上面的公式。
2-3在有n(n>1000)个元素的升序数组A
中查找关键字x。查找算法的伪代码如下所示:
k = 0;
while ( k<n 且 A[k]<x ) k = k+3;
if ( k<n 且 A[k]==x ) 查找成功;
else if ( k-1<n 且 A[k-1]==x ) 查找成功;
else if ( k-2<n 且 A[k-2]==x ) 查找成功;
else 查找失败;
本算法与二分查找(折半查找)算法相比,有可能具有更少比较次数的情形是:(2分)
- 当x不在数组中
- 当x接近数组开头处
- 当x接近数组结尾处
- 当x位于数组中间位置
解析:类似于顺序查找,显然第二个是对的。
2-4下列二叉树中,可能成为折半查找判定树(不含外部结点)的是: (4分)
解析:答案是第一个。下面我们来分析为什么。
首先我们可以知道对应的判定树的叶子节点是向右偏移,向左偏移。
因此我们知道2,3不对,其次叶子节点一定是连续的,不会出现第四个的情况。
编程题:
7-1 两个有序序列的中位数 (25 分)
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
输入样例1:
5
1 3 5 7 9
2 3 4 5 6
输出样例1:
4
输入样例2:
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
输出样例2:
1
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 5;
int n;
int a[maxn], b;
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", a + i);
int pos = 0, cnt = 0, ans;
for(int i = 0; i < n; i++)
{
scanf("%d", &b);
while(pos < n && a[pos] < b)
{
cnt++;
if(cnt == (2 * n + 1) / 2)
ans = a[pos];
pos++;
}
cnt++;
if(cnt == (2 * n + 1) / 2)
ans = b;
}
printf("%d\n", ans);
return 0;
}