当前位置:   article > 正文

Round17—顺序查找、二分查找_用二分查找从100个有序整数中查找某数,最坏情况下需要比较的次数是:

用二分查找从100个有序整数中查找某数,最坏情况下需要比较的次数是:

知识点:

知道什么是顺序查找,什么是二分查找,知道判定树,知道二分查找的最大比较次数是log(N)+1

单选题:

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。查找算法的伪代码如下所示:

  1. k = 0;
  2. while ( k<n 且 A[k]<x ) k = k+3;
  3. if ( k<n 且 A[k]==x ) 查找成功;
  4. else if ( k-1<n 且 A[k-1]==x ) 查找成功;
  5. else if ( k-2<n 且 A[k-2]==x ) 查找成功;
  6. else 查找失败;

本算法与二分查找(折半查找)算法相比,有可能具有更少比较次数的情形是:(2分)

  • 当x不在数组中
  • 当x接近数组开头处
  • 当x接近数组结尾处
  • 当x位于数组中间位置

解析:类似于顺序查找,显然第二个是对的。

2-4下列二叉树中,可能成为折半查找判定树(不含外部结点)的是: (4分)

解析:答案是第一个。下面我们来分析为什么。

首先我们可以知道(l+r)2对应的判定树的叶子节点是向右偏移,(l+r)2向左偏移。

因此我们知道2,3不对,其次叶子节点一定是连续的,不会出现第四个的情况。

编程题:

7-1 两个有序序列的中位数 (25 分)

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A​0​​,A​1​​,⋯,A​N−1​​的中位数指A​(N−1)/2​​的值,即第⌊(N+1)/2⌋个数(A​0​​为第1个数)。

输入格式:

输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。

输出格式:

在一行中输出两个输入序列的并集序列的中位数。

输入样例1:

  1. 5
  2. 1 3 5 7 9
  3. 2 3 4 5 6

输出样例1:

4

输入样例2:

  1. 6
  2. -100 -10 1 1 1 1
  3. -50 0 2 3 4 5

输出样例2:

1

AC代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 100000 + 5;
  4. int n;
  5. int a[maxn], b;
  6. int main()
  7. {
  8. scanf("%d", &n);
  9. for(int i = 0; i < n; i++)
  10. scanf("%d", a + i);
  11. int pos = 0, cnt = 0, ans;
  12. for(int i = 0; i < n; i++)
  13. {
  14. scanf("%d", &b);
  15. while(pos < n && a[pos] < b)
  16. {
  17. cnt++;
  18. if(cnt == (2 * n + 1) / 2)
  19. ans = a[pos];
  20. pos++;
  21. }
  22. cnt++;
  23. if(cnt == (2 * n + 1) / 2)
  24. ans = b;
  25. }
  26. printf("%d\n", ans);
  27. return 0;
  28. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/624546
推荐阅读
相关标签
  

闽ICP备14008679号