1.二元查找树的任何结点的左右子树都是二元查找树()
对/错
解:对
解析:
二元查找树: 它首先要是一棵 二元树 ,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的 根结点 的值;
(3)左、右子树也分别为二元查找树
2.用希尔排序方法对一个数据序列进行排序时,若第1趟排序结果为9,1,4,13,7,8,20,23,15,则该趟排序采用的增量(间隔)可能是 。
A.2 B.3 C.4 D.5
解:B
解析:
首先,第二个元素为1,是整个序列中的最小元素,所以可知该希尔排序为从小到大排序。然后考虑增量问题,
若增量为2,第1+2个元素4明显比第1个元素9要小,A排除;
若增量为3,第i、i+3、i+6个元素都为有序序列(i=1,2,3),符合希尔排序的定义;
若增量为4,第1个元素9比第1+4个元素7要大,C排除;
若增量为5,第1个元素9比第1+5个元素8要大,D排除,
3.采用二分查找方法查找长度为n的线性表时,每个元素的平均查找长度为()
A.O(n^2) B.O(nlog2n) C.O(n) D.O(log2n)
解:D
解析:
二分查找方法的思想:将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。
最好的情况是:待查关键字刚好位于序列中间,第一次即查到。
最坏的情况是:第一次查找,还剩下n/2个元素需要比较;第二次,还剩n/4……第i次查找,还剩下n/2i个元素需要比较,直到剩余最后一个元素,查找结束。
最后n/2i=1,即n=2i,i为查找的次数(长度),i=log2n,
4.将一个递归算法转换为非递归算法,通常需要借用的数据结构是( )
A.栈 B.队列 C.线性表 D.广义表
解:A
解析:
栈和递归的原理是一样的
栈是后进先出
递归的第一次判断先‘进’,最后返回;终止条件最后‘进’,第一个返回
5.数据表A中有10000个元案,如果仅要求求出其中最大的10个元素,则采用()排序算法最节省时间。
A.简单选择排序 B.希尔排序 C.堆排序 D.快速排序
解:C
解析:
6.在下列排序算法中,哪一个算法的时间复杂度与初始排序无关( )。
A.直接插入排序 B.气泡排序 C.快速排序 D.直接选择排序
解:D
解析:
堆归选基与初始序列无关
快选希堆排序不稳定
7.排序时,若不采用计数排序的等空间换时间的方法,合并m个长度为n的已排序数组的时间复杂度最优为()
A.O(mn(logm)) B.O(mlog(n)) C.O(nm^2) D.O(nm)
解:A
解析:当n=1时,就成了m个数的归并排序,时间复杂度为O(mlogm)
8.
A.对数组a进行插入排序(升序) B.对数组a进行插入排序(降序)
C.对数组a进行选择排序(升序) D.对数组a进行选择排序(降序)
解:A
解析:
插入排序的原理:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的移动数据,空出一个适当的位置,把待插入的元素放到里面去
选择排序的原理:每次在无序队列中“选择”出最小值,放到有序队列的最后,并从无序队列中去除该值。
9.以下属于稳定排序的是()
A.归并排序和基数排序 B.快速排序和堆排序
C.选择排序和希尔排序 D.插入排序和冒泡排序
解:AD
解析:
稳定:冒泡、插入、归并、计数、桶、基数
不稳定:选择、希尔、快速、堆
10.以下各排序算法与其平均时间复杂度对应正确的有()
A.快排 O(nlogn) B.桶排序 O(nlogn) C.冒泡排序 O(n^2) D.归并排序 O(n^2)
解:AC
解析:
快排: O(nlogn)
桶排:O(n+k)
冒泡:O(n^2)
归并:O(nlogn)
11.多维数组可以看作数据元素也是基本线性表的基本线性表,这样的说法正确吗?
解:正确
解析:数组和一维数组一样,都是一段连续的内存
12.使用快速排序算法对序列9,1,3,8,23,5,7,10,29,19进行排序,基准数取9,则第1趟排序后的结果为( )
A.9,1,3,8,23,5,7,10,29,19 B.7,1,3,8,5,9,23,10,29,19
C.1,3,8,9,23,5,7,10,29,19 D.9,1,3,8,23,5,7,10,19,29
解:B
解析:先确定基准值,然后从后向前找比基准值小的数,找到后将其与比它小的数进行交换,然后从前向后找比基准值大的数,将其交换,周而复始,直到确定下基准值的位置
13.以下哪种排序算法对[1, 3, 2, 4, 5, 6, 7, 8, 9]进行排序最快
A.改良的冒泡排序 B.快速排序 C.归并排序 D.堆排序
解:A
解析:
改良的冒泡排序时间复杂度降到O(n)。
堆排序、快速排序、堆排序平均时间复杂度都为O(nlogn)
14.假设你只有100Mb的内存,需要对1Gb的数据进行排序,最合适的算法是()
A.归并排序 B.插入排序 C.快速排序 D.冒泡排序
解:A
解析:首先内存只有100Mb,而数据却有1Gb,所以肯定没法一次性放到内存去排序,只能用外部排序,而外排序通常是使用多路归并排序,即将原文件分解成多个能够一次性装入内存的部分(如这里的100Mb),分别把每一部分调入内存完成排序(根据情况选取适合的内排算法),然后对已经排序的子文件进行多路归并排序(胜者树或败者树)
15.堆排序的时间复杂度是(),堆排序中建堆过程的时间复杂度是()
A.O(n2),O(n log n) B.O(n),O(n log n)
C.O(n log n),(n) D.O(n log n),O(n log n)
解:C
解析:
堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。时间复杂度O(n*logn)
如果从底部最后的父节点开始建堆,那么我们可以大概算一下: 假如有N个节点,那么高度为H=logN,最后一层每个父节点最多只需要下调1次,倒数第二层最多只需要下调2次,顶点最多需要下调H次,而最后一层父节点共有2^(H-1)个,倒数第二层公有2^(H-2),顶点只有1(2^0)个,所以总共的时间复杂度为s = 1 * 2^(H-1) + 2 * 2^(H-2) + ... + (H-1) * 2^1 + H * 2^0 将H代入后s= 2N - 2 - log2(N),近似的时间复杂度就是O(N)。
16.使用堆排序方法排序(45,78,57,25,41,89),初始堆为( )
A.78,45,57,25,41,89 B.89,78,57,25,41,45
C.89,78,25,45,41,57 D.89,45,78,41,57,25
解:B
解析:
首先建立完全二叉树
从最后一个叶子节点开始
第一次交换了57和89的位置
然后比较45和89,进行交换
再比较换下来的45,45不符合大根堆,与57交换
17.在下列语句中,正确的是( )。
A.char a [3] []= { 'abc','i'}; B.char a[] [3]={'abc','i'};
C.char a[3] []= {'a',"i"}; D.char a[] [3]={"a","i"};
解:D
解析:字符串可以这么存储:char a[]="hello world";
18.若下三角矩阵An×n,按列顺序压缩存储在数组Sa[0…(n+1)n/2]中,则非零元素aij的地址为( )。(设每个元素占d个字节,数组下标从0开始)
A.[(j-1)*n+i-1]*d B.[(j-1)*n+i]*d
C.[(j-1)*n+i+1]*d D.[(j-1)*n+i-2]*d
解:A
19.二维数组和多维数组均不是线性结构。( )
解:正确
解析:
一维数组是线性结构
二维数组就是一种非线性结构(因为是一对多的关系了:a[0]对应两个:a[0][0]、a[0][1])
20.以下排序算法时间复杂度为 O(nlogn) 的是()
A.冒泡排序 B.快速排序 C.堆排序 D.插入排序
解:BD
解析:
冒泡排序O(n^2)
插入排序O(n^2)
快速排序O(nlogn)
堆排序O(nlogn)