算法 —— 第二章 递归与分治策略

第二章 递归与分治策略

判断题

1-1算法分析的两个主要方面是时间复杂度和空间复杂度的分析。

T

1-2在具有NNN个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。

F

1-3仅基于比较的算法能得到的最好的“最坏时间复杂度”是O(NlogN)。

T

1-4对NNN个记录进行快速排序,在最坏的情况下,其时间复杂度是O(NlogN)。

F

1-5(neuDS)直接插入排序算法在最好情况下的时间复杂度为O(n)。

T

单选题

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

A.7
B.10
C.50
D.99

2-2用分治法解决一个规模为NNN的问题。下列哪种方法是最慢的?

A.每步将问题分成规模均为N/3的2个子问题,
  且治的步骤耗时O(N)
B.每步将问题分成规模均为N/3的2个子问题,
  且治的步骤耗时O(NlogN)
C.每步将问题分成规模均为N/2的3个子问题,
  且治的步骤耗时O(N)
D.每步将问题分成规模均为N/3的3个子问题,
  且治的步骤耗时O(NlogN)

2-3(NeuDS_C++)对线性表进行二分查找时,要求线性表必须( )。

A.以顺序方式存储
B.以链接方式存储
C.以顺序方式存储,且结点按关键字有序排序
D.以链接方式存储,且结点按关键字有序排序

2-4下列排序算法中,哪种算法可能出现:在最后一趟开始之前,所有的元素都不在其最终的位置上?(设待排元素个数N>2)

A.冒泡排序
B.插入排序
C.堆排序
D.快速排序

2-5给定 100,000,000 个待排记录,每个记录 256 字节,内存为128MB。若采用简单2路归并,需要做多少轮?

A.10
B.9
C.8
D.7

2-6对N个记录进行归并排序,归并趟数的数量级是:

A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N^2)

2-7对N个记录进行归并排序,空间复杂度为:

A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N^2)

2-8采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是:A.每次划分后,先处理较长的分区可以减少递归次数B.每次划分后,先处理较短的分区可以减少递归次数C.递归次数与每次划分后得到的分区处理顺序无关D.递归次数与初始数据的排列次序无关作者DS课程组单位浙江大学2-8答案错误(0 分)创建提问
2-9若数据元素序列{ 12, 13, 8, 11, 5, 16, 2, 9 }是采用下列排序方法之一得到的第一趟排序后的结果,则该排序算法只能是:

A.快速排序
B.选择排序
C.堆排序
D.归并排序

2-10在外排序中,设我们有5个长度分别为2、8、9、5、3的有序段。则下列哪种归并顺序可以得到最短归并时间?

A.归并长度为2和3的有序段,得到段Run#1;
  将Run#1与长度为5的有序段归并,得到段Run#2;
  将Run#2与长度为8的有序段归并,得到段Run#3;
  将Run#3与长度为9的有序段归并
  
B.归并长度为2和3的有序段,得到段Run#1;
  将Run#1与长度为5的有序段归并,得到段Run#2;
  归并长度为8和9的有序段,得到段Run#3;
  归并Run#2和Run#3
  
C.归并长度为2和3的有序段,得到段Run#1;
  归并长度为5和8的有序段,得到段Run#2;
  归并Run#1和Run#2,得到段Run#3;
  将Run#3与长度为9的有序段归并
  
D.归并长度为2和3的有序段,得到段Run#1;
  归并长度为5和8的有序段,得到段Run#2;
  将Run#2与长度为9的有序段归并,得到段Run#3;
  归并Run#1和Run#3
答案
1~5  ACCBB
6~10 ABCDB

PTA编程题

2-1找第k小的数
题目

设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数。

提示:函数int partition(int a[],int left,int right)的功能是根据a[left] ~ a[right]中的某个元素x(如a[left]) 对 a[left] ~ a[right] 进行划分,划分后的x所在位置的左段全小于等于x,右段全大于等于x,同时利用x所在的位置还可以计算出x是这批数据按升非降序排列的第几个数。因此可以编制int find(int a[],int left,int right,int k)函数,通过调用partition函数获得划分点,判断划分点是否第k小,若不是,递归调用find函数继续在左段或右段查找。

输入格式:

输入有两行:
第一行是n和k,0<k<=n<=10000
第二行是n个整数

输出格式:

输出第k小的数

输入样例:
10 4
2 8 9 0 1 3 6 7 8 2
输出样例:
2
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[10010];
int main()
{
   
	int n,k;
   	cin>>n>>k;
   	for(int i=0;i<n;i++)
		cin>>a[i];
 	sort(a,a+n
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值