排序、递归、查找
1.该图的拓扑排序序列序列为()
解:1,2,3,4,5
解析:找没有前驱的顶点;首先1没有前驱,找到1并删除与它相关的所有边;接下来为2,删除相关的边;以此类推。
2.
解:插入排序
插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
3.某一趟排序结束后未必能选出一个元素放在棋最终位置上的是
A.堆排序 B.冒泡排序 C.直接插入排序 D.快速排序
解:C.直接插入排序
解析:
堆排序每趟结束都能将一个最值放在根节点
冒泡排序进行两两比较,每趟选出最大值或最小值
快速排序一趟可以选出比关键值大的和比关键值小的,从而确定位置
直接插入排序插入的时候不能确定一个元素的最终位置
4.在排序算法中,每次从未排序的记录中挑出最小(或最大)关键码字的记录,加入到已排序记录的末尾,该排序方法是()
解:选择排序
解析:选择排序的思想就是每次从剩余序列中选出最小的元素排在序列的第一位,一直到待选择序列长度为0
5.直接插入排序算法适用于哪种情形下
解:待排序数据大部分已排序时
6.下列排序方法中,属于稳定排序的是()
A.选择排序 B.希尔排序 C.堆排序 D.归并排序
解:D.归并排序
解析:
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,
冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
7.在长度为n的顺序表的第i(1≤i≤n+1)个位置上插入一个元素,元素的移动次数为
解:n-i+1
解析:
比如: 1 2 4 5 6
在第三个位置插入3
n-i = 5 - 3 = 2
但是移动的次数是3,所以 n-i+1
8.合并排序相对于快速排序的优点不包括()
A.是稳定的 B.最坏的情况更高效 C.空间复杂度低 D.不会退化
解:C.空间复杂度低
解析:
合并排序,空间复杂度为 o(n)
快速排序,空间复杂度是 o(logn)
9.对n个记录的线性表进行快速排序为减少算法的递归深度,以下叙述正确的是()
A.每次分区后,先处理较短的部分 B.每次区分后,先处理较长的部分
C.与算法每次分区后的处理顺序无关 D.以上三者都不对
解:A
解析:
在快速排序中,需要使用递归来分别处理左右子段,递归深度可以理解为系统栈保存的深度,先处理短的分段再处理长的分段,可以减少时间复杂度;
如果按长的递归优先的话,那么短的递归会一直保存在栈中,直到长的处理完。短的优先的话,长的递归调用没有进行,他是作为一个整体保存在栈中的,所以递归栈中的保留的递归数据少一些。
10.使用KMP算法在文本串S中找模式串P是一种常见的方法。假设S=P={xyxyyxxyx},亦即将S对自己进行匹配,匹配过程中正确的next数组是____。
解:0,1,1,2,3,1,2,2,3
解析:
11.有 1000 个无序的整数,希望使用最快的方式找出前 50 个最大的,最佳的选择是( )
A.冒泡排序 B.基数排序 C.堆排序 D.快速排序
解:堆排序
解析:
1:简单选择 最好时间 O(n^2) 平均时间O(n^2) 最坏时间 O(n^2)
2:直接插入 最好时间 O(n) 平均时间O(n^2) 最坏时间 O(n^2)
3:冒泡排序 最好时间 O(n) 平均时间O(n^2) 最坏时间 O(n^2)
4:希尔排序 最好时间 O(n) 平均时间O(logn) 最坏时间 O(n^s) 1<s<2
5:快速排序 最好时间 O(nlogn) 平均时间O(nlogn) 最坏时间O(n^2)
6:堆排序 最好时间 O(nlogn) 平均时间O(nlogn) 最坏时间O(nlogn)
7:归并排序 最好时间 O(nlogn) 平均时间O(nlogn) 最坏时间O(nlogn)
12.在内部排序时,若选择了归并排序而没有选择插入排序,则可能的理由是 。
Ⅰ.归并排序的程序代码更短 Ⅱ.归并排序的占用空间更少 Ⅲ.归并排序的运行效率更高
解:Ⅲ.归并排序的运行效率更高
解析:
归并排序代码比选择插入排序更复杂,
归并排序空间复杂度是O(n),后者是O(1)。
归并排序时间复杂度是O(nlogn),后者是O(n2)。
13.请指出堆排序、选择排序、冒泡排序、快速排序、的时间复杂度()
冒泡和选择 : n^2
快速和堆排序:nlogn
14.已知数组元素基本有序的情况下,下面采用那个算法对数组排序时间复杂度最低()
A.直接选择排序 B.堆排序 C.快速排序 D.插入排序
解:D.插入排序
解析:
因为数组元素,基本有序,所以快速排序是最慢的,因为会退化成冒泡排序
选择排序时间复杂度都是O(n^2),堆排序都是O(nlogn),但是基本有序对插入排序是最好的
因为这样只需要比较大小,不需要移动,时间复杂度趋近于O(n)
15.凡是递归定义的数据结构都可以用递归算法来实现它的操作。( )
正确/错误
解:正确
解析:递归算法:指通过重复,将问题分成同类子问题,而解决问题的方法
16.
A.10 B.11 C.12 D.14
解:12
解析:
一、先算内层f(9)
[1] 计算 f(9) = f(7) + f(3) + 1;
[2] 计算[1]中 f(7) = f(5) + f(1) + 1;
[3] 计算[2]中 f(5) = f(3) + f(-1) + 1;
[4] 计算[3]中 f(3) = 1;
[5] 计算[3]中 f(-1) = 1;
{至此f(5)可计算得: f(5) = 1 + 1 + 1 = 3}
[6]
{至此f(7)可计算得 :f(7) = 3 + 1 + 1 = 5}
[7]
{至此f(9)可计算得:f(9) = 5 + 1 + 1 = 7}
计算f(9)一共调用了7次函数
二、计算外层f(7)
由上面步骤可知,计算f(7)调用了5次函数
所以一共调用了函数7+5=12次
17.递归函数中的形参是()
A.自动变量 B.外部变量 C.静态变量 D.可根据需要自定义存储类型
解:A.自动变量
解析:
递归是借助栈来实现的,自动变量是存储在栈里面的,随着递归的进行,自动创建和销毁。
外部变量和静态变量存放在静态存储区。外部变量和静态变量是不能作为递归函数的参数的。
18.有一段楼梯台阶有15级台阶,以小明的脚力一步最多只能跨3级,请问小明登上这段楼梯有多少种不同的走法?()
A.2345 B.3261 C.5768 D.6843
解:5768
解析:类似斐波那契数列的思想
假设走n步阶梯的方法总数为f(n),那么对于n步的阶梯,有三种情况:第一步走一步,第一步走两步,第一步走三步,
走完第一步后剩下的走法分别有f(n-1),f(n-2),f(n-3)种走法,
所以有: f(n)=f(n-1)+f(n-2)+f(n-3) (对于n>=4)
同理: f(n-1)=f(n-2)+f(n-3)+f(n-4) (对于n>=5)
前面两式相减可以得到: f(n)=2*f(n-1)-f(n-4) (对于n>=5)
而对于n<=5的情况有:
f(1)=1,f(2)=2 , f(3)=4 ,f(4)=7
于是有:
f(5)=2*7-f(1)=13 ,(6)=2*13-f(2)=24 , f(7)=2*24-f(3)=44 ,f(8)=88-f(4)=81 ,f(9)=2*81-f(5)=149 <
f(10)=298-f(6)=274 ,f(11)=548-f(7)=504 ,f(12)=1008-f(8)=927 ,f(13)=1854-f(9)=1854-149=1705
f(14)=3410-f(10)=3410-274=3136 ,f(15)=6272-f(11)=6272-504=5768
19.
A.9 B.12 C.18 D.24
解:18
解析:
一、先算内层f(8)
[1] 计算 f(8) = f(6) + f(4) + 1;
[2] 计算[1]中 f(6) = f(4) + f(2) + 1;
[3] 计算[2]中 f(4) = f(2) + f(-2) + 1;
[4]计算[1]中 f(4) = f(2) + f(-2) + 1;
[5] 计算中 f(2) = 1;
[6] 计算中 f(-2) = 1;
[7] {至此可计算得: f(4) = 1 + 1 + 1 = 3}
[8] {至此可计算得 :f(6) = 3 + 1 + 1 = 5}
[9] {至此)可计算得:f(8) = 5 + 3 + 1 = 7}
计算f(8)一共调用了9次函数
二、计算外层f(8)
由上面步骤可知,计算f(8)调用了9次函数
所以一共调用了函数18次
20.于静态表的顺序查找法,若在表头设置监视哨,则正确的查找方式为()
A. 从第0个元素往后查找该数据元素 B. 从第1个元素往后查找该数据元素
C. 从第n个元素往开始前查找该数据元素 D.与查找顺序无关
解:C. 从第n个元素往开始前查找该数据元素
解析:
监视哨是最后需要比较的元素,
监视哨若在表头 则从后往前
监视哨若在表尾 则从前往后