Date: 2019-08-10
1. 快速排序总比简单排序快() 错
解释: 当原有数列是有序的,快排和简单选择时间复杂度都为O(n^2)
2. 在索引顺序表中,实现分块查找,在等概率查找情况下,其平均查找长度不仅与表中元素个数有关,而且与每块中元素个数有关() 对
解释:
假设有n个数,分块查找,每个块有k个数,这样可以分成n/k块;
对每个块检索,可以有klogk;
这样所有的数,共有n/k * klogk = nlogk
3. 计算算法的时间复杂度是属于一种() 事前分析估算的方法
解释: 算法时间复杂度是运行实际程序前通过分析和估算衡量算法的效率。
4. 下面给出的四种排序法中()排序法是不稳定性排序法 D
A. 插入
B. 起泡
C. 二路归并
D. 堆
解释:冒泡排序、基数排序、归并排序、插入排序算法都是稳定性算法(冒归基插)。不稳定的:快排,堆排,希尔,选择
5. 对有 n 个记录的表作快速排序,在最坏情况,算法的时间复杂度是 (O(n^2)) ;最坏情况即是基本有序的情况下。
6. 下面的哪种排序算法在算复杂度平均不是O(nlogn)的? B
A.快速排序
B.桶排序
C.归并排序
D.二叉树排序树排序
E.堆排序
解释;
桶排序的平均时间复杂度为线性的O(N+C),其中C=N*(logN-logM)。如果相对于同样的N,桶数量M越大,其效率越高,最好的时间复杂度达到O(N)。 当然桶排序的空间复杂度 为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。
7. 对同一待排序序列分别进行折半插入排序和直接插入排序,两者之间可能的不同之处是 ()。 D
A. 排序的总趟数
B. 元素的移动次数
C. 使用辅助空间的数量
D .元素之间的比较次数
解释;折半插入排序,是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。 所以,很明显比较的次数减少了。
补充:
1、算法复杂度与初始状态无关的有:选择排序、堆排序、归并排序、基数排序。
2、元素总比较次数与初始状态无关的有:选择排序、基数排序。
3、元素总移动次数与初始状态无关的有:归并排序、基数排序。
8.
假设小明用某个排序算法对整数序列(82,45,25,15,21)进行排序。一下为排序过程中序列状态的变化过程:
输入:82 45 25 15 21
第一步:45 82 25 15 21
第二步:25 45 82 15 21
第三步:15 25 45 82 21
······
请问小明用的是什么排序算法? 插入排序算法(插入排序,特点是,第n轮,前n个数字会有序。 )
解释:
该题考查的是不同排序方法的原理,从题目中可以得出是逐步将待排序的元素插入到已排序序列的对应位置,属于插入排序。
选择排序:将第一个元素作为基准,后面的元素依次和第一个元素做比较选出最小元素,并和第一个元素交换位置,所以经过第一步排序可以确定整个序列的最小元素。A不正确。
归并排序:两两合并排序,第一步的元素25,15应该交换位置作为子序列,所以B不正确。
快速排序:需要枢轴值为比较对象,第一步排序后会将序列分为大于枢轴和小于枢轴两部分,题目选项后三个元素均小于枢轴而没有放到枢轴之前
9. 将两个各有n个元素的有序表归并成一个有序表,其最多的比较次数是() 2n-1
解释: 最多的比较次数是当两个有序表的数据刚好是插空顺序的时候,比如:第一个序列是1,3,5,第二个序列是2,4,6,把第二个序列插入到第一个序列中,先把第二个序列中的第一个元素2和第一个序列依次比较,需要比较2次(和1,3比较),第二个元素4需要比较2次(和3,5比较,因为4比2大,2之前的元素都不用比较了),第三个元素6需要比较1次(只和5比较),所以最多需要比较5次。即2n-1次。
10. 输入若已经是排好序的(升序),下列排序算法最快的是() A
A. 插入排序
B. Shell排序
C. 合并排序
D. 快速排序
解释:
快速排序在元素基本无序的情况下是最好的选择,在基本递增或递减中时间复杂度是O(n^2)
归并排序时间复杂度稳定在O(nlogn)
希尔排序很难说,跟选择的增量有关,一般小于O(n^2),大于O(n)
插入排序是在序列已有序的情况下最快的,时间复杂度是O(n),另外在数数据规模较小时插入排序效果也很好。
一般不选择传统的冒泡排序,如果题目中有一个选项是冒泡排序,要想一下是否隐含着改进冒泡排序的含义。
11. 在外部排序时,利用选择树方法在能容纳m个记录的内存缓冲区中产生的初始归并段的平均长度为2m个记录() 对
解释:
内排序:我们常用的选择、交换、插入、归并、基数排序都属于内排序,只用在内存读一次原始数据即可完成排序。
外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行多路归并排序。
由于利用选择树选择出来后,就是将两个长度为m的子节点数组归并成一个长度为2m的根节点数组,然后再取数据,依次向上递归,如下图。
X
/ \
a[m] a[m] 由于最后一个可能不够m,所以那一个初始归并X段会稍微小,但是最后求所有X平均的话应该是2m附近。
12. 以下哪种排序算法对[1, 3, 2, 4, 5, 6, 7, 8, 9]进行排序最快 ? 基本有序:插入排序或者改进的冒泡排序算法
堆排序无论排序序列有序还是无序,时间复杂度都为O(nlogn),但改良的冒泡排序可以将时间复杂度降到O(n)。其次,归并排序无论有序还是无序其时间复杂度也是O(nlogn),归并排序在归并的时候,如果右路最小值比左路最大值还大,那么只需要比较n次,但如果右路每个元素分别比左路对应位置的元素大,那么需要比较2*n-1次,该序列明显满足第二个条件,所以其时间复杂度为O(2n)
13. 在下列排序算法中,哪一个算法的时间复杂度与初始序列无关( ) 一堆(堆)乌龟(归并)选(选择)基(基数)友
直接插入排序
冒泡排序
快速排序
直接选择排序
解释:
1.直接插入排序
需要和前面都有序序列对比插入的位置,如果本身有序,则每次对比一个即可。
最坏情况,则需要一直对比到第一个元素
最好时间复杂度O(n),最坏时间复杂度O(n^2)
2.冒泡排序
假设递增冒泡,需要每次把无序部分最大的移动到无序部分的最右边,如果本身就是递增,则无序移动,遍历一遍就完成了。
最好时间复杂度为O(n),最坏时间复杂度为O(n^2);
3.快速排序
大家都知道,最差为O(n^2),平均为O(nlogn)
4.直接选择排序
每次需要遍历一遍选择无序部分最大的,无论是否有序,都要遍历才能找到,所以其时间复杂度与初始序列无关。
14. 以下排序算法中,最坏情况时间复杂度与其他选项不同的是()D
冒泡排序
插入排序
快速排序
归并排序
15. 为实现快速排序算法,待排序序列宜采用的存储方式是()。 A(快速排序中元素进行比较,需要快速查询,而顺序存储适用于频繁快速查询)
A. 顺序存储
B.散列存储
C. 链式存储
D.索引存储
补充解释:
1、顺序存储方式:顺序存储方式就是在一块连续的存储区域(物理)一个接着一个的存放数据。一般采用数组或结构数组来描述。
2、链式存储方式:链式存储方式比较灵活,节点逻辑上相邻,但不要求节点在物理位置上(存储区域)相邻,一个节点的引用字段往往指向下一个节点的存放位置,比如链表;
3、索引存储方式:索引存储方式是采用附加的索引表的方式来存储节点信息的一种存储方式。索引表由若干索引项组成。索引存储方式中索引项的一般形式为(关键字、地址);
4、散列存储方式:散列存储方式是根据节点o的关键字,利用散列函数直接计算出该节点的存储地址的一种存储方式。
16. 用希尔(Shell)方法排序时,若关键字的初始排序杂乱无序,则排序效率就低() 错
时间复杂度受增量序列的影响明显大于其他因素,最坏的情况是o(n2),好的情况在o(n1.3),与增量序列选择有关。
17. 下列程序的时间复杂度是(o(n^2))
for (int i = 1, s = 0; i <= n; ++i)
{
int t = 1;
for (int j = 1; j <= i; ++j)
t = t * j;
s = s + t;
}
18. 一棵哈夫曼树的带权路径长度等于其中所有叶结点的带权路径长度之和() 对
解释: 树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和。
结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。
19. 在用邻接表表示图的情况下,建立图的算法的时间复杂度为() o(n+e)
解释:在邻接表中,给定一顶点,很容易地找出它的所有邻边,因为只需要读取它的邻接表就可以了,题目中的n表示n个结点,e表示e条边
20. 基于比较方法的n个数据的内部排序。最坏情况下的时间复杂度能达到的最好下界是() O(nlogn)
解释:
基于比较的排序算法有:(1)直接插入排序;(2)冒泡排序;(3)简单选择排序;(4)希尔排序;(5)快速排序;(6)堆排序;(7)归并排序。
分配式排序:基数排序、桶排序
21. 已知字符串S 为“abaabaabacacaabaabcc”,模式串 t 为“abaabc”。采用 KMP 算法进行匹配,第一 次出现“失配”(s[i]≠t[j]) 时,i=j=5,则下次开始匹配时,i 和 j 的值分别是 () 。 i=5,j=2
22. n!后面有多少个0,6!=1*2*3*4*5*6=720.720后面有1个0,n=10000,求n!。 2499个
解释:
10000/5=2000 有2000个能被5整除
2000/5=400 这2000个里面能被5整除有400个(2000个已被5除过1次。能除第二次的有400)
400/5=80 同理 80个
80/5=16 同理 16个
16/5=3余1 同理 3个
结果2000+400+80+16+3=2499
用短除法
24. 关键路径是AOE网中() 从始点到终点的最长路径
解释:在AOE网中,从源点到汇点的所有路径中,具有最大路径长度的路径成为关键路径。在AOE网中,可以有不止一条的关键路径。
25. 外排中使用置换选择排序的目的,是为了增加初始归并段的长度() 对
解释:外部排序过程中,为了减少外存读写次数需要减小归并趟数(外部排序的过程中用到归并),归并趟数为: (其中k为归并路数,n为归并段的个数)。增加k和减小n都可以达到减小归并趟数的目的。置换-选择排序就是一种减小n的、在外部排序中创建初始归并段时用到的算法。它可以让初始归并段的长度增减,从而减小初始归并段的段数(因为总的记录数是一定的)
26. 下列选项中,不可能是快速排序第2趟排序结果的是 () C
2,3,5,4,6,7,9
2,7,5,6,4,3,9
3,2,5,4,7,6,9
4,2,3,5,7,6,9
解释:四个选项都是同样的数组元素,若完全有序,应为2345679
每经过一趟快排,轴点元素都必然就位,也就是说,一趟下来至少有1个元素在其最终位置
所以考察各个选项,看有几个元素就位即可。
A:2、3、6、7、9
B:2、9
C:9
D:5、9
第二趟至少应有2个元素就位,所以C不对。
27. 假设在有序线性表A[1..30]上进行二分查找,则比较五次查找成功的结点数为( ) 15
解释:
查找一次成功的节点数为1,值为15
查找二次成功的节点数为2,值为7,,23
查找三次成功的节点数为4,值为3,11,19,27
查找四次成功的节点数为8,值为1,5,9,13,17,21,25,29
查找五次成功的节点数为15,值为2,3,4,6,8,10,12,14,16,18,20,22,24,26,28,30
28. 将一组无序的正整数重新排列成有序序列,其方法有() BCD
拓扑排序
快速排序
堆排序
基数排序
29. 下面哪一方法可以判断出一个有向图是否有环(回路)() AB
深度优先遍历
拓扑排序
Dijkstra求最短路径
求关键路径
解释:
如果是又环的话,使用深度优先遍历,会碰到重复的节点;B本来就是用来判断是不是存在环的;广度优先遍历不可以,因为广度优先搜索过程中如果访问到一个已经访问过的节点,可能是多个节点指向这个节点,不一定是存在环
30. 在最好情况下,下列排序算法中() 排序算法所需比较关键字次数最少。 AB
冒泡排序
直接插入排序
快速排序
归并排序
解释:
冒泡排序若文件初始为正序,则一趟冒泡即㐓完成,比较次数是n-1
直接插入也是初始是正序, 比较次数也是n-1
快速排序---越是正序,需要时间越多大于n-1
归并排序-------每一趟归并都得比较,第一趟归并比较是n-1,后面都大于n-1
31. 已知图的邻接表如下所示,根据算法,则从顶点 0 出发按深度优先遍历的结点序列是(BCD)
0132
0231
0321
0123
牛客上解释:
直接先根据邻接表还原图:
0
1 - 2- 3
对该图深度优先搜索
0 1 2 3
0 2 1 3
0 3 2 1
如果在遍历上优先序号最大节点,则:
0 3 2 1
0 2 3 1
0 1 2 3
题外话:题目说的遍历顺序,着实让人不解,实际遍历顺序应该为
0 3 2 1 2 3 1 1 2 3
假如遍历到4个节点的时候,做以记录,则结果只有
0 3 2 1,
其他因为不满足四个节点而无法记录。很奇怪,这样的题目,没意思。
part two:
1. 若在线性表中采用折半查找法查找元素,该线性表应该:() 元素按值有序且采用顺序存储结构
解释:折半查找需要先对查找的数据集合排序,并且每次要获得数据列表的中间位置,通过数组这种顺序存储结构,只要一次索引就能获得中间值,如果是链式结构,就每次都要从头遍历到中间位置,耗费大量时间。
2. 答案:快速排序
解释: 快速排序将数据按照基准数据(一般选择第一个元素,此处选择中间元素)分为左右两部分,左边都比基准数据小,右边都比基准数据大,按照中间位置,递归左右两侧,直到只有一个数据时,排序完成。
3. 归并排序辅助存储为O(1)() 错; 归并排序时所有排序算法中空间复杂度最高的,为O(n)
4. 优化过后的冒泡排序算法关键字比较的次数与记录的初始排列次序无关,这样的说法正确吗? 错误
解释: 原始冒泡排序算法与序列的初始状态没有关系,都需要进行O((n*(n-1))/2)次比较;但是对于改进后的冒泡排序(当某趟判断是不需要进行交换时,就表明该序列已经排好序了,停止排序。)的比较次数是与初始状态有关的。
5. 使用二分查找算法在一个有序序列中查找一个元素的时间复杂度为( ) o(logN)
补充:
1. 顺序查找,时间复杂度为O(n)
2. 二分查找,时间复杂度为O(logn)
3. 插值查找,关键字分布又比较均匀, 时间复杂度为O(log(logn))
4. 斐波那契查找,时间复杂度为O(logn)
5. 树表查找
a) 二叉树查找算法,插入和查找的时间复杂度均为O(logn)
b) 红黑树,logn
c) B树和B+树,O(log n)
6. 分块查找,关键字构成一个索引表
7. 哈希查找,以空间换时间的算法
6. 衡量查找算法效率的主要标准是( )。 均匀查找长度
解释:
评价一个算法的优劣主要就看两方面:算法的时间复杂度和算法的空间复杂度
1:算法的时间复杂度一般用于衡量一个算法的运行效率(平均查找长度)
2:算法的空间复杂度指的是算法运行过程中对资源的消耗情况
7. 下列哪个查找方法的平均查找长度与查找表中数据元素个数无关? 哈希(散列)查找
解释:顺序查找方法和折半查找方法的平均查找长度都与元素的个数有关,由于散列结构是由事先准备好的散列函数关系与处理冲突的方法来确定数据元素在散列表中的存储位置的,因此散列表查找方法的平均查找长度与元素的个数无关
8. 对线性表进行二分查找,其前提条件是 有序的查找表
注意:顺序表只是说明数据存储是有序的,但是并不代表存储的值是有序的。
9. 设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度(O(n))
解释:
首先要找打插入位置,
由于单链表不能像顺序表那样二分查找,因此只能顺序查找,查找的时间复杂度为O(n)
其次是插入,链表的插入操作时间复杂度是O(1)
因此总的操作时间复杂度为O(n)
10. 顺序查找法适用于存储结构为顺序或链接存储的线性表。()正确
解释:因为顺序查找时每一个每一个进行遍历,不需要索引,所以链表存储也是可以的。
顺序存储的线性表不但逻辑上连续,物理上也连续,可以使用顺序查找法。
链式存储的线性表虽然物理上不一定连续,但逻辑上连续(通过额外的指针表示逻辑相邻关系),也可以使用顺序查找法。
11. 排序算法的稳定是指,关键码相同的记录排序前后相对位置不发生改变,下面哪种排序算法是不稳定的() 选堆希快不稳
12. 串的朴素模式匹配算法,主要思想是对主串(S)的每一个字符作为子串(T)开头,与要匹配的字符串进行匹配。主串(S)的长度为n,要匹配的子串的长度为m,那么朴素模式匹配算法的最坏时间复杂度为:O((n-m+1)*m)
例如:S:1 2 3 4 5 6 7 8 9 n=9,m=2,则S中需要匹配的首字母是:1 2 3 4 5 6 7 8,然后每个作为首字母时,需要进行m次比较。
13. 设顺序表的长度为 n 。下列排序方法中,最坏情况下比较次数小于 n(n-1)/2 的是( )。 堆排序
解释:
堆排的最好、最坏、平均时间复杂度均为O(nlogn);
快排最坏时间复杂度为O(n^2),发生在序列基本有序情况下;
简单插入排序最坏时间复杂度为O(n^2),发生条件:逆序;
冒泡排序最坏时间复杂度为O(n^2),发生条件:逆序;
14. 在长度为n的有序线性表中进行二分查找,最坏情况下需要比较的次数是( )。 O(logn)
15. 基数分类只适用于以数字为关键字的情况,不适用于以字符串为关键字的情况() 错,字符也是可以的
16. 以下排序方式中占用O(n)辅助存储空间的是 归并排序(归并排序是所有排序中占用内存最多,但是效率比较高且稳定的算法,即牺牲内存提高了效率)
17. 下列程序段的时间复杂度是 。
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
解释:O(nlogn)
内层循环条件j<=n与外层循环的变量无关,每次循环j自增1,每次内层循环都执行n次。外层循环条件为k<=n,增量定义为k*=2,可知循环次数为2k<=n,即k<=log2n。所以内层循环的时间复杂度是O(n),外层循环的时间复杂度是O(log2n)。对于嵌套循环,根据乘法规则可知,该段程序的时间复杂度T(n)=T1(n)*T2(n)=O(n)*O(log2n)=O(nlog2n)
18. 在所有的排序方法中,关键字比较的次数与记录的初始排列次序无关的是 。 选 基
19. 二叉排序树删除一个结点后,仍是二叉排序树。() 正确
解释:二叉排序树的左子树结点值均小于根结点值;右子结点值均大于根结点值。所以删除一个数后仍然为二叉排序树。
20. 设有递归算法如下,最终打印结果是()
#include<stido.h>
int foo(int a ,int b)
{
if (b == 0) return 0;
if (b %2 == 0) return foo(a+a,b/2);
return foo(a+a,b/2)+a;
}
void main()
{
printf("%d",foo(1,3));
}
解释分析:
计算foo(1,3):此时a=1,b=3;
跳过两个if语句进入return foo(1+1,3/2)+1,即foo(2,1)+1;
计算foo(2,1):
同样,跳过两个if语句进入return foo(2+2,1/2)+2,即foo(4,0)+2;
计算foo(4,0):
进入第一个if语句,return 0;
逐层返回,得foo(2,1)=0+2=2;
再返回上一层,得foo(1,3)=2+1=3;
返回结果,foo(1,3)=3;
21.
void recursive(int n, int m, int o)
{
if (n <= 0)
{
printf("%d,%d\n", m, o);
}
else
{
recursive(n - 1, m + 1, o);
recursive(n - 1, m, o + 1);
}
}
以上代码的时间复杂度是: O(2^n)
22. 设顺序线性表的长度为30,分成5块,每块6个元素,如果采用分块查找并且索引表和块内均采用顺序查找,则其平均查找长度为( )。 6.5
注意解释: 预备知识:一个小知识点:平均查找长度。 顺序查找:从表的一端开始,顺序扫描线性表 表中有n个元素,假设为{1,2,...,n},那么,在等概率的条件下,平均查找长度为:ASL=(1+2+...n)/n=(n+1)/2
分析: 分块查找会分两部分进行,第一步先进行索引表查找判断其在那个字表中,第二步然后进行在字表中的查找
索引表有5个元素 所以平均查找长度为:(1+5)/2=3
字表中有6个元素,所以平均查找长度为:(1+6)/2=3.5
所以总的平均查找长度为3+3.5=6.5
23. 假设在有序线性表A[1..30]上进行二分查找,则比较五次查找成功的结点数为( ) 15 答案见前面
24. 在一个有8个int数据的数组中,随机给出数组的数据,找出最大和第二大元素一定需要进行()次比较: 9
网友答案:
25. 下列排序算法的常规实现中,哪些空间复杂度是O(1) ABE
A. 冒泡
B. 选择
C. 归并O(N)
D.快排 O(logN)
E. 堆排序
26. 下列关于效率的说法不正确的是() D
A. 效率是一个性能要求,其目标应该在需求分析时给出
B. 提高程序效率的根本途径在于选择良好的设计方法,数据结构与算法
C. 效率主要指处理机时间和存储器容量两个方面
D. 程序的效率与程序的长度强相关
27. 排序趟数与序列的原始状态有关的排序方法是()排序法 优化的冒泡算法+快速排序算法
解释:
1、总排序趟数与初始状态无关的有:(除了快速排序和优化的冒泡,其他都是)
2、算法复杂度与初始状态无关的有:堆排序、归并排序、选择排序、基数排序。
3、元素总比较次数与初始状态无关的有:选择排序、基数排序。
4、元素总移动次数与初始状态无关的有:归并排序、基数排序。
28. 基于链式队列,关于计数排序的叙述中正确的是(BC ) 计数排序 计数排序 计数排序
A. 计数排序是一种基于比较的排序算法 (基于统计的排序算法)
B.计数排序的时间复杂度为O(n+k)
C.计数排序的空间复杂度为 O(k)
D.计数算法是原地排序算法 (不是原地排序算法)
解释:
B. 需要遍历所有数据,时间复杂度 O(N) ,但最后输出排序后的序列更合理,设 k 为数据范围(最大值 - 最小值),则遍历标记数组需要 O(k) ,总共 O(N+k) 。
C. 当数据范围是 k 时,空间复杂度 O(k)
29. 在排序方法中,元素比较次数与元素的初始排列无关的是() 选择+基数