选择题
- 下述几种排序方法中,要求内存最大的是(D)
A.快速排序
B.插入排序
C.选择排序
D.归并排序
解析:冒泡排序,简单选择排序,堆排序,直接插入排序,希尔排序的空间复杂度为O(1),因为需要一个临时变量来交换元素位置,(另外遍历序列时自然少不了用一个变量来做索引)
快速排序空间复杂度为logn(因为递归调用了) ,
归并排序空间复杂是O(n),需要一个大小为n的临时数组.
基数排序的空间复杂是O(n), - 下列排序方法中,比较次数与待排序记录的初始状态无关的是(C)
A.插入排序和快速排序
B.归并排序和快速排序
C.选择排序和归并排序
D.插入排序和归并排序
解析:
逐个分析下:
插排 时间复杂度与比较次数,移动次数都与初始序列有关
快排 时间复杂度与比较次数,与移动次数都与初始序列有关
归排 时间复杂度与初始序列无关,比较次数有关(有序序列),移动次数无关(无论怎么有序,还是每个元素拷贝到新的数组)
选排 时间复杂度与初始序列无关,比较次数无关,移动次数无关
冒排 时间复杂度与初始序列无关,比较次数无关,移动次数有关 - 单链表的存储密度(C)
A.大于 1;
B.等于 1;
C.小于 1;
D.不能确定
解析:
存储密度=单链表数据项所占空间/结点所占空间
因为结点中包含数据项和指针,所以存储密度小于1 - 向一个栈顶指针为 h 的带头结点的链栈中插入指针 s 所指的结点时,应执行 操作。(D)
A.h->next=s ;
B.s->next=h ;
C.s->next=h ;h =s ;
D.s->next=h->next ;h->next=s ;
解析:
- 下列排序方法中,若将顺序存储更换为链式存储,则算法的时间效率会降低的是 。(D)
Ⅰ.插入排序 Ⅱ.选择排序 Ⅲ.起泡排序 Ⅳ.希尔排序 Ⅴ.堆排序
A.仅Ⅰ、Ⅱ
B.仅Ⅱ、Ⅲ
C.仅Ⅲ、Ⅳ
D.仅Ⅳ、Ⅴ
解析:
插入排序、选择排序、起泡排序原本时间复杂度是O(n2),更换为链式存储后的时间复杂度还是O(n2)。希尔排序和堆排序都利用了顺序存储的随机访问特性,而链式存储不支持这种性质,所以时间复杂度会增加,因此选D。 - 设散列表的长度为10,散列函数H(n)=n mod 7,初始关键字序列为 (33,24,8,17,21,10),用链地址法作为解决冲突的方法,平均查找长度是()
A.1
B.1.5
C.2
D.2.5
解析:
链地址法,将所有具有相同哈希地址的而不同关键字的数据元素连接到同一个单链表中
33%7=5 24%7=3 8%7=1 17%7=3 放在24后面(24->17)21%7=0 10%7=3放在17后面(24->17->10)
(1+1+1+2+1+3)/6=1.5 - 设一组初始记录关键字序列为(345,253,674,924,627),则用基数排序需要进行(A)趟的分配和回收才能使得初始关键字序列变成有序序列。
A.3
B.4
C.5
D.8
解析:
基数排序分配和回收的趟数只与元素长度有关。
基数排序是通过“分配”和“收集”过程来实现排序。
1)首先根据个位数值(只看个位)来排序:
253 674 924 345 627
2)再看十位(只看十位数值大小)来排序:
924 627 345 253 674
3)最后看百位:
253 345 627 674 924
所以最后的结果排序为 253 345 627 674 924,需要3趟。 - 对递归程序的优化的一般的手段为()
A.尾递归优化
B.循环优化
C.堆栈优化
D.停止值优化
解析:
常见的优化手段有尾递归,迭代,循环
尾递归:在每一次递归的过程中保持了上一次计算的状态,也就是“线性迭代过程”
尾递归和一般的递归不同在对内存的占用,普通递归创建stack累积而后计算收缩,尾递归只会占用恒量的内存(和迭代一样) - 数组必须是同类型值的集合(B)
A.对
B.错
解析;
数据的逻辑结构分为集合,线性结构,树,图。
数组属于线性结构,不是集合。
集合中值不能重复,数组中可以,所以数组不能是集合 - 顺序查找的平均时间是多少?(A)
A.n/2
B.n
C.n*n
D.log n
解析:
顺序查找,目标数据可能在序列的任意位置,平均位置是n/2
所以顺序查找平均时间是n/2
注意本题问的是平均时间,不是时间复杂度,时间复杂度只取数量级,略去常数为O(n)
编程题
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。