第一章——褚论
第二章——线性表
第三章——栈与队列
第四章——字符串
第五章——树与二叉树
第六章——图
第七章——排序
第八章——检索
判断题
1-1
仅基于比较的算法能得到的最好的“最坏时间复杂度”是O(NlogN)。
T 对N个记录进行快速排序,在最坏的情况下,其时间复杂度是O(NlogN)。
1-2
对N个记录进行简单选择排序,比较次数和移动次数分别为O(N2 )和O(N)。
T
1-3
对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。
F
1-4
要从50个键值中找出最大的3个值,选择排序比堆排序快。
T 规模较小直接选择排序快。
1-5
对N个记录进行快速排序,在最坏的情况下,其时间复杂度是O(NlogN)。
F
最坏的情况下为O(N2)
1-6
(neuDS)直接插入排序算法在最好情况下的时间复杂度为O(n)。
T
1-7
对N个不同的数据采用冒泡排序进行从大到小的排序,当元素基本有序时交换元素次数肯定最多。
F
单选题
2-1
下列排序算法中,哪种算法可能出现:在最后一趟开始之前,所有的元素都不在其最终的位置上?(设待排元素个数N>2)
冒泡排序
插入排序
堆排序
快速排序
2-2
对于7个数进行冒泡排序,需要进行的比较次数为:
7
14
21
49
6+5+4+3+2+1=21;
2-3
排序方法中,从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置的方法称为:
插入排序
选择排序
快速排序
归并排序
2-4
对于10个数的简单选择排序,最坏情况下需要交换元素的次数为:
9
36
45
100
解析:
对于简单选择排序,无论最好最坏都要交换N-1次;
2-6
若数据元素序列{ 12, 13, 8, 11, 5, 16, 2, 9 }是采用下列排序方法之一得到的第一趟排序后的结果,则该排序算法只能是:
快速排序
选择排序
堆排序
归并排序
解析:
- 排除选择排序,因为选择排序后,最前面一定是最小的或最大的;
- 排除快速排序,因为快速排序一次后,有两个值相同,有一个数存放在临时变量;
- 排除堆排序 一次排序后建堆
由图可看出不符合堆; - 归并排序 12 13 | 8 11 | 5 16 | 2 9 符合;
2-7
设有1000个元素的有序序列,如果用二分插入排序再插入一个元素,则最大比较次数是:
1000
999
500
10
2-9
对初始状态为递增序列的表按递增顺序排序,最费时间的是()算法。
快速排序
归并排序
插入排序
堆排序
2-10
对序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排列变为{4,9,-1,8,20,7,15},则采用的是()排序法。
快速
希尔
冒泡
选择
2-11
就平均性能而言,目前最好的内排序方法是()排序法。
希尔
冒泡
快速
交换
2-12
对序列{15,9,7,8,20,-1,4,} 用希尔排序方法排序,经一趟后序列变为{15,-1,4,8,20,9,7}则该次采用的增量是()。
2
1
4
3
2-17
对初始数据序列{ 8, 3, 9, 11, 2, 1, 4, 7, 5, 10, 6 }进行希尔排序。若第一趟排序结果为( 1, 3, 7, 5, 2, 6, 4, 9, 11, 10, 8 ),第二趟排序结果为( 1, 2, 6, 4, 3, 7, 5, 8, 11, 10, 9 ),则两趟排序采用的增量(间隔)依次是:
3, 1
3, 2
5, 2
5, 3
2-13
下列排序算法中,()算法可能会出现下面情况:在最后一趟开始之前,所有元素都不在其最终的位置上。
快速排序
堆排序
冒泡排序
插入排序
2-16
数据序列{ 3, 1, 4, 11, 9, 16, 7, 28 }只能是下列哪种排序算法的两趟排序结果?
冒泡排序
快速排序
插入排序
堆排序
2-14
若用冒泡排序法对序列{10,14,26,29,41,52}从大到小排序,需进行()次比较。
25
3
15
10
解析:
需要进行5!次比较即
(5+1)*5/2=15
2-15
对于快速排序,当待排记录有序时,每回划分均以第一个元素作为枢轴,如下说法正确的是:
适用于顺序存储结构,算法时间复杂度时O(N)
适用于链式存储结构,算法时间复杂度时O(N)
适用于顺序存储结构,算法时间复杂度时O(N^2)
适用于链式存储结构,算法时间复杂度时O(N^2)
填空题
5-1
本题要求用冒泡排序将一组整数按增序排序。冒泡排序每次从头到尾扫描待排序列,检查相邻两数的顺序,如果顺序不对就交换。请补全下列冒泡排序的代码。
typedef struct node *nodeptr;
struct node{
int value;
nodeptr next;
/* 一些其他的项,在此忽略 */
};
nodeptr BubbleSort (nodeptr h)
{/* h 是带空头结点的链表的头指针 */
nodeptr p, q;
int flag_swap;
if (!h->next) return h;
do{
flag_swap = 0;
p = h;
while (p->next->next){
if (
p->next->value > p->next->next->value
){
flag_swap++;
q = p->next;
p->next = q->next
;
q->next = p->next->next
;
p->next->next = q
;
}
else p = p->next;
}
} while (flag_swap > 0);
return h;
}
p->next->value>p->next->next->value
p->next=q->next
q->next=p->next->next
p->next->next=q
5-3
本题要求给出希尔排序对给定初始序列{9, 8, 7, 6, 5, 4, 3, 2, 1}利用增量序列{1, 3, 7}进行排序的分步结果。将每步结果填在下列空中。注意:相邻数字间必须有一个空格,开头结尾不得有多余空格。
原始序列 9 8 7 6 5 4 3 2 1
增量7排序后 2 1 7 6 5 4 3 9 8
增量3排序后 2 1 4 3 5 7 6 9 8
增量1排序后 1 2 3 4 5 6 7 8 9