1.判断下列说法是否正确:所有内部排序方法都是基于关键字比较的排序方法。( )
解:错误
解析:
常见的内部排序有:
- 插入排序(直接插入排序):将待排序的数字逐渐插入到已排好序的元素序列中,需要关键字的比较。
- 快速排序:通过一趟排序将待排序数列分割为两部分,一部分比基准值大,另一部分比基准值小,需要关键字的比较。
- 选择排序(简单选择排序):从待排序序列中选择一个最大(或最小)的元素放在序列的首位置,直到所有的序列排列完成。需要关键字比较。
- 归并排序:将序列先拆分为多个子序列,使子序列有序,再逐步合并,直至整个序列有序。需要关键字比较。
- 冒泡排序:相邻元素逐个比较做交换。
- 希尔排序:缩小增量排序,属于插入排序的一种。
- 堆排序:大根堆的要求是每个节点的值都不大于其父节点的值,小根堆相反。
2.在C语言中,顺序存储长度为3的字符串,需要占用( )个字节。
A.3 B.4 C.6 D.12
解:B
解析:char 、short 、int各占1、2、4个字节;字符串每个占用1字节,末尾还有'\0',所以一共是4字节
3.判断下列说法是否正确:一个n阶对称矩阵,矩阵元为Aij将其下三角部分以行序为主序存放在一维数组M[0,n(n+1)/2-1]中,设矩阵最左上角矩阵元为A00,则矩阵元A64对应的位置为M[25]。( )
解:正确
解析:将矩阵(下半个三角部分)的元素依次按照每行的元素添加到数组中,求的是A64前面有多少元素。
A00
A01 A11
……
……A64
根据数列的计算:0+1+2+3+4+5+6+5个元素,结果为25个元素,所以A64对应M[25]
4.具有12个关键字的有序表,折半查找的平均查找长度()
A. 3.1 B. 4 C. 2.5 D.5
解:A
解析:
将12个数画成完全二叉树,第一层有1个、第二次2个、第三层4个,第四层只有5个。
二分查找时:
第一层需要比较1次
第二两个数,每个比较2次
第三层四个数,每个比较3次
第四层五个数,每个比较4次
则平均查找长度即为:(1+2*2+3*4+4*5)/12 = 37/12 = 3.0833
5.对于满足折半查找和分块查找条件的文件而言,无论它存在何种介质上,均能进行顺序查找,折半查找和分块查找()
解:错
解析:存储在顺序介质如磁带上,无法随机读写,自然无法二分与分块。
6.数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为( )。
A.SA+141 B.SA+144 C.SA+222 D.SA+225
解:C
解析:
先,本题的数组是从A[1][1]开始的,也就是说和所谓的数组从零开始没什么关系。
A[1][1]的起始地址为SA,那么A[1][2]为SA+3.....A[2][1]为SA+3*10.....A[i][j]为SA+((i-1)*10+(j-1))*3。
那么A[8][5]的起始地址就是SA+ (7*10+4)*3=SA+222.
7.一个5*4的矩阵,有多少个长方形?(正方形也算是长方形)
A.120 B.150 C.100 D.80
解:B
解析:长任取两个点C(6,2)*宽任取两个点C(5,2) = 15* 10 = 150
8.
A.14 B.18 C.20 D.24 E.None of the above
解:E
解析:
针对这样的题目在别的地方看到的比较好的方法是用树来表示
10
8 6
6 4 4 2
4 2 2 0 2 0
2 0
图中树的节点数是15,所以是调用了15次
9.下面的排序算法中,不稳定的是()
A.起泡排序 B.折半插入排序 C.简单选择排序 D.希尔排序 E.基数排序 F.堆排序
解:CDF
解析:不稳定:一堆希尔快选
10.Which statement declares a variable a which is suitable for referring to an array of 50 string objects?(Java)
A.char a[][]; B.String a[]; C.String[] a; D.Object a[50]; E.String a[50]; F.Object a[];
解:BCF
解析:
A:char[][] 定义了二位字符数组。在Java中,使用字符串对char数组赋值,必须使用toCharArray()方法进行转换。所以A错误。
B、C:在Java中定义String数组,有两种定义方式:String a[]和String[] a。所以B、C正确。
D、E:数组是一个引用类型变量 ,因此使用它定义一个变量时,仅仅定义了一个变量 ,这个引用变量还未指向任何有效的内存 ,因此定义数组不能指定数组的长度。所以D、E错误。
F:Object类是所有类的父类。子类其实是一种特殊的父类,因此子类对象可以直接赋值给父类引用变量,无须强制转换,这也被称为向上转型。
11.在下列关于“字符串”的陈述中,不正确的描述是()
A.字符串是一种特殊的线性表
B.字符串可以连续存储,也可以链式存储
C.字符串的长度必须大于零
D.‘’空串”与“空白串”不是同一个含义
解:C
解析:
- 字符串的值中每个字符可以是字母、数字或其他字符组成的序列,组成线性表的每个元素就是一个单字符,所以是一种特殊的线性表,
- 串是特殊的线性表,故其存储结构与线性表的存储结构类似,只不过组成串的结点是单个字符而已。
- 字符串:是有零个或多个字符组成的有序序列,是计算机处理的最基本的非数值数据。
- 空串是长度为0,内容为空;空白串是包含一个或多个空白字符‘ ’(空格键)的字符串。
12.通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入的排序算法是()
A.归并排序 B.选择排序 C.希尔排序 D.插入排序
解:D
解析:
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
13.已知关键字序列为(51,22,83,46,75,18,68,30),按关键码字51进行一趟快速排序,完成后的序列为()
A.(30,22,18,46,51,75,68,83)
B.(30,18,22,46,51,75,83,68)
C.(30,18,22,46,51,75,68,83)
D.(18,22,30,46,51,68,75,83)
解:A
解析:
算法思想:首先在数组中选择一个基准点,然后分别从数组的两端扫描数组,设两个指示标志(low指向起始位置,high
指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换low和high位置的值,然后从前半部分开始
扫描,发现有元素大于基准点的值,就交换low和high位置的值,如此往复循环,直到low>=high,然后把基准点的值放到
high这个位置。一次排序就完成了。
第一趟的变化过程如下:
51,22,83,46,75,18,68,30
30 ,22,83,46,75,18,68, 51
30,22, 51 ,46,75,18,68, 83
30,22, 18 ,46,75, 51 ,68,83
30,22,18,46, 51 , 75 ,68,83
14.希尔排序的组内排序采用的是 ()
A.直接插入排序 B.折半插入排序 C.快速排序 D.归并排序
解:A
解析:
希尔排序的思想是:先将待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成),分别进行直接插入排序,
然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
15.有关插入排序的叙述,错误的是( )
A.插入排序在最坏情况下需要O(n2)时间
B.插入排序在最佳情况可在O(n)时间内完成
C.插入排序平均需要O(nlog2n)时间
D.插入排序的空间复杂度为O(1)
解:C
解析:插入排序平均需要O(n^2)时间
16.已知串S= ‘babab ' , 其 Next 数值序列为
A.0112 B.01233 C.01123 D.01223
解:C
解析:
符串的前缀和后缀(这里的前缀是不包括最后一个字符的子串,后缀是不包含第一个字符的子串)。
拿题目中的字符串a=''babab''举例,
- 第一位0。
- 第二位1。
- 第三位,字符串是“bab”,这时候“bab”的前缀有b,ba;后缀有ab,b,可以看出前后缀相等的最长的字符串只有b,因为b的长度是1,所以这里第三位的next值就是1。
- 第四位,字符串是“baba”,前缀是b,ba,bab;后缀是aba,ba,a。这里可以看出前后缀相等的最长的字符串是ba,长度是2,因此第四位的next值是2。
- 第五位,字符串是“babab”,前缀是b,ba,bab,baba;后缀是abab,bab,ab,b。这里可以看出前后缀相等的最长的字符串是bab,长度是3,因此第五位的next值是3。
因此综合起来next值就是0 1 1 2 3
17.已知数据表A中每个元素距其最终位置不远,为节省时间排序,应采用什么方法排序?
A.堆排序 B.插入排序 C.快速排序 D.选择排序
解:B
解析:
插入排序:如果平均每个元素离最终位置相距c个元素,则其复杂度为O(cn),一共n趟,每次比较c次;
快速排序:最好的、平均的复杂度都是O(nlog(n)),如果每次选择的中间数都最小或最大,那就是最坏的情况,复杂度是O(n*n);所以快速排序和元素的位置没有关系,跟选择的中间数有关。
堆排序:复杂度一直是O(nlog(n));
直接选择排序:跟元素位置没有关系,都要遍历n遍,每遍找出最小或最大数来,复杂度是O(n*n);
18.若有以下定义和语句:则输出结果是
A.4 B.5 C.9 D.10
解:A
解析:strcpy(s1,s2)这个函数是把s2字符串拷贝到s1这个字符串,同时也把s2的 '\0' 拷过去,所以覆盖了s1的所有字符,所以strcpy执行完后是“1234” strlen("1234") 就是4了
19.在一个长为33厘米的光滑凹轨上,在第3厘米、第6厘米、第19厘米、第22 厘米、第26厘米处各有一个钢珠,凹轨很细,不能同时通过两个钢珠,开始时,钢珠运动方向是任意的。两个钢珠相撞后,以相同速度反向运动。假设所有钢珠初 始速度为每秒运动1厘米,那么所有钢珠离开凹轨的最长可能时间是()
A.30 B.26 C.38 D.33
解:A
解析:
所有球离开的最长时间,就可以等效为最后离开的那个球的时间,也就变成找哪个球离左边或右边出口的距离最远,显然5个球中,第一个球离右端出口(33-3)30是距离最远的。
20.下列说法错误的是()
A.已知一颗二叉树的前序遍历顺序和后序遍历顺序,可以唯一确定这棵二叉树
B.将一个递归算法改为非递归算法时,通常使用队列作为辅助结构
C.快速排序和堆排序都是不稳定排序
D.二分查找法,平均时间复杂度为O(n)
解:ABD
解析:
前序 中序 后序 这三个两两组合, 必须要有中序才能唯一确定一棵二叉树 前与后 不能唯一确定
递归算法改为非递归算法时,通常使用栈作为辅助结构(先进后出)
二分查找平均时间复杂度是O(logn),只有在最坏的情况下才是O(n)
不稳定排序:堆、希尔、快、选