严魏敏课后习题
选择题
-
从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为( )。
A. 归并排序
B. 冒泡排序
C. 插入排序
D. 选择排序 -
从未排序序列中挑选元素,并将其依次插入已排序序列(初始时为空)末端的方法,称为( )。
A. 归并排序
B. 冒泡排序
C. 插入排序
D. 选择排序 -
对n个不同的关键字由小到大进行冒泡排序,在下列( )情况下比较的次数最多。
A. 从小到大排列好的
B. 从大到小排列好的
C. 元素无序
D. 元素基本有序 -
对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数为( )。
A. n+1
B. n
C. n−1
D. n(n−1)/2 -
快速排序在下列( )情况下最易发挥其长处。
A. 被排序的数据中含有多个相同排序码
B. 被排序的数据已基本有序
C. 被排序的数据完全无序
D. 被排序的数据中的最大值和最小值相差悬殊 -
对n个关键字做快速排序,在最坏情况下,算法的时间复杂度是( )。
A. O(n)
B. O(n2)
C. O(nlog2n)
D. O(n3) -
若一组记录的排序码为(46, 79, 56, 38, 40, 84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为( )。
A. 38, 40, 46, 56, 79, 84
B. 40, 38, 46, 79, 56, 84
C. 40, 38, 46, 56, 79, 84
D. 40, 38, 46, 84, 56, 79 -
下列关键字序列中,( )是堆。
A. 16, 72, 31, 23, 94, 53
B. 94, 23, 31, 72, 16, 53
C. 16, 53, 23, 94, 31, 72
D. 16, 23, 53, 31, 94, 72 -
堆是一种( )排序。
A. 插入
B. 选择
C. 交换
D. 归并 -
堆的形状是一棵( )。
A. 二叉排序树
B. 满二叉树
C. 完全二叉树
D. 平衡二叉树 -
若一组记录的排序码为(46, 79, 56, 38, 40, 84),则利用堆排序的方法建立的初始堆为( )。
A. 79, 46, 56, 38, 40, 84
B. 84, 79, 56, 38, 40, 46
C. 84, 79, 56, 46, 40, 38
D. 84, 56, 79, 40, 46, 38 -
下述几种排序方法中,要求内存最大的是( )。
A. 希尔排序
B. 快速排序
C. 归并排序
D. 堆排序 -
下述几种排序方法中,( )是稳定的排序方法。
A. 希尔排序
B. 快速排序
C. 归并排序
D. 堆排序 -
数据表中有10000个元素,如果仅要求求出其中最大的10个元素,则采用( )算法最节省时间。
A. 冒泡排序
B. 快速排序
C. 简单选择排序
D. 堆排序 -
下列排序算法中,不能保证每趟排序至少能将一个元素放到其最终的位置上的排序方法是( )。
A. 希尔排序
B. 快速排序
C. 冒泡排序
D. 堆排序
答案:
1-5 CDCDC 6-10 BADBC 11-15 BCCCB
应用题
- 设待排序的关键字序列为{12, 2, 16, 30, 28, 10, 16*, 20, 6, 18},试分别写出使用以下排序方法,每趟排序结束后关键字序列的状态。
① 直接插入排序
9趟
2,12
,16, 30,28,10,16*,20,6,18
2,12,16
, 30,28,10,16*,20,6,18
2,12,16, 30
,28,10,16*,20,6,18
2,12,16,28,30
,10,16*,20,6,18
2,10,12,16,28,30
,16*,20,6,18
2,10,12,16,16*,28,30
,20,6,18
2,10,12,16,16*,20,28,30
,6,18
2,6,10,12,16,16*,20,28,30
,18
2,6,10,12,16,16*,18,20,28,30
② 折半插入排序
折半插入排序中的排序功能其实就是直接插入排序,则同①
③ 希尔排序(增量选取5、3和1)
12
,2,16, 30,28,10
,16*,20,6,18
10
,2,16,6
,18,12,16*
,20,30,28
(增量:5)
6,2,12,10,18,16,16*,20,30,28 (增量:3)
2,6,10,12,16,16*,18,20,30,28 (增量:1)
④ 冒泡排序
12,2,16, 30,28,10,16*,20,6,18
2,12,16,28,10,16*,20,6,18,30
2,12,16,10,16*,20,6,18,28,30
2,12,10,16,16*,6,18,20,28,30
2,10,12,16,6,16*,18,20,28,30
2,10,12,6,16,16*,18,20,28,30
2,10,6,12,16,16*,18,20,28,30
2,6,10,12,16,16*,18,20,28,30
2,6,10,12,16,16*,18,20,28,30
⑤ 快速排序
前面空开,先从后面找
12,2,16, 30,28,10,16*,20,6,18
6,2,10,12,28,30,16,20,16,18
2,6,10,12,18,16,16*,20,28,30
2,6,10,12,16*,16,18,20,28,30
2,6,10,12,16*,16,18,20,28,30
⑥ 简单选择排序
写全,最后一行。
12,2,16, 30,28,10,16*,20,6,18
2,12,16, 30,28,10,16*,20,6,18
2,6,16, 30,28,10,16*,20,12,18
2,6,10, 30,28,16,16*,20,12,18
2,6,10,12,28,16,16*,20, 30,18
2,6,10,12,16,28,16*,20, 30,18
2,6,10,12,16,16*,28,20, 30,18
2,6,10,12,16,16*,18
,20, 30,28
2,6,10,12,16,16*,18,20
, 28,30
2,6,10,12,16,16*,18,20, 28
,30
⑦ 堆排序{画图}
12,2,16, 30,28,10,16*,20,6,18
2,6,12,10,20,18,16,16*,28,30
2,6,10,12,16*,20,18,16,30,20
2,6,10,12,20,16*,28,18,16,30
2,6,10,12,16*,20,16,28,18,30
2,6,10,12,16*,16,20,30,28,18
2,6,10,12,16*,16,18,20,30,28
2,6,10,12,16*,16,18,20,28,30
2,6,10,12,16*,16,18,20,28,30
⑧ 二路归并排序
两两对比
2,12,16,30,10,28,16*,20,6,18
2,12,16,30,10,16*,20,28,6,18
2,10,12,16,16*,20,28,30,6,18
2,6,10,12,16,16*,18,20,28,30
- 给出如下关键字序列{321, 156, 57, 46, 28, 7, 331, 33, 34, 63},试按链式基数排序方法,列出每一趟分配和收集的过程。
尽快做一下
- 对输入文件(101,51,19,61,3,71,31,17,19,100,55,20,9,30,50,6,90);当k=6时,使用置换-选择算法,写出建立的初始败者树及生成的初始归并段。
尽快做一下
算法设计题
- 试以单链表为存储结构,实现简单选择排序算法。
尽快做一下
- 有n个记录存储在带头结点的双向链表中,利用双向冒泡排序法对其按升序进行排序,请写出这种排序的算法。(注:双向冒泡排序即相邻两趟排序向相反方向冒泡)
尽快做一下
- 设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红、白、蓝之一。要求重新安排这些砾石,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石在后,重新安排时对每粒砾石的颜色只能看一次,并且只允许交换操作来调整砾石的位置。
尽快做一下
- 编写算法,对n个关键字取整数值的记录序列进行整理,以使所有关键字为负值的记录排在关键字为非负值的记录之前,要求:① 采用顺序存储结构,至多使用一个记录的辅助存储空间;② 算法的时间复杂度为O(n)。
尽快做一下
- 借助于快速排序的算法思想,在一组无序的记录中查找给定关键字值等于key的记录。设此组记录存放于数组r[1…n]中。若查找成功,则输出该记录在r数组中的位置及其值,否则显示“not find”信息。请简要说明算法思想并编写算法。
尽快做一下
- 有一种简单的排序算法,叫做计数排序。这种排序算法对一个待排序的表进行排序,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键字互不相同,计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键字比该记录的关键字小。假设针对某一个记录,统计出的计数值为c,那么,这个记录在新的有序表中的合适的存放位置即为c。
① 给出适用于计数排序的顺序表定义;
② 编写实现计数排序的算法;
③ 对于有n个记录的表,关键字比较次数是多少?
④ 与简单选择排序相比较,这种方法是否更好?为什么?
尽快做一下
总结
以下全部复制书上内容。
得出以下几点结论:
(1)当待排序的记录个数n较小时,n2和nlog2n的差别不大,可选用简单的排序
方法。
而当关键字基本有序
时,可选用直接插入排序
或冒泡排序
,排序速度很快,其中直接插入排序最为简单常用、性能最佳
。
(2)当n较大时,应该选用先进的排序方法。对于先进的排序方法,从平均时间性能而言,快速排序最佳
,是目前基于比较的排序方法中最好的方法。但在最坏情况下,即当关键字基本有序时,快速排序的递归深度为n,时间复杂度为O(n2),空间复杂度为O(n)。
堆排序
和归并排序
不会出现快速排序的最坏情况,但归并排序的辅助空间较大
。这样,当n较大时,具体选用的原则是:
① 当关键字分布随机
,稳定性不做要求时,可采用快速排序
;
② 当关键字基本有序
,稳定性不做要求时,可采用堆排序
;
③ 当关键字基本有序,内存允许且要求排序稳定
时,可采用归并排序
。
(3)可以将简单的排序方法和先进的排序方法结合使用。
例如,当n较大时,可以先将待排序序列划分成若干子序列,分别进行直接插入排序
,然后再利用归并排序
,将有序子序列合并成一个完整的有序序列。
或者,在快速排序中,当划分子区间的长度小于某值时,可以转而调用直接插入排序
算法。
(4)基数排序的时间复杂度也可写成O(d·n)。因此,它最适用于n值很大而关键字较小的序列。
若关键字也很大,而序列中大多数记录的“最高位关键字”均不同,则亦可先按“最高位关键字”不同将序列分成若干“小”的子序列,而后进行直接插入排序。
但基数排序
使用条件有严格的要求:需要知道各级关键字的主次关系和各级关键字的取值范围,即只适用于像整数和字符这类有明显结构特征的关键字,当关键字的取值范围为无穷集合时,则无法使用基数排序。
(5)从方法的稳定性来比较,基数排序是稳定的内排方法
,所有时间复杂度为O(n2)的简单排序法也是稳定的,然而,快速排序、堆排序和希尔排序
等时间性能较好
的排序方法都是不稳定
的。一般来说,如果排序过程中的“比较”是在“相邻的两个记录关键字”间进行的,则排序方法是稳定的。
(6)在本章讨论的排序方法中,多数是采用顺序表实现的。若记录本身信息量较大,为避免移动记录耗费大量时间,可采用链式存储结构。比如直接插入排序、归并排序
都易于在链表上实现。但像折半插入排序、希尔排序、快速排序和堆排序
,却难于在链表
上实现。
对于外部排序,常用的方法是归并方法,这种方法主要由两个独立的阶段组成:
第一,把待排序的文件划分成若干个子文件;
第二,逐趟归并子文件,最后形成对整个文件的排序。
为减少归并中外存读写的次数,提高外排序的效率,一般通过增大归并路数和减少初始归并段个数两种方案对归并算法进行改进,其中,“多路平衡归并”的方法可以增加归并段的个数,“置换-选择”的方法可以减少初始归并段的个数。
学完本章后,要求掌握与排序相关的基本概念,
如:关键字比较次数
、数据移动次数
、稳定性
、内部排序
、外部排序
。深刻理解各种内部排序方法的基本思想、特点、实现方法及其性能分析,能从时间、空间、稳定性
各个方面对各种排序方法做综合比较,并能加以灵活应用。掌握外部排序
方法中败者树
的建立及归并方法,掌握置换-选择排序
的过程和最佳归并树的构造方法。
选用哪种排序一般综合考虑以下因素:
(1)待排序的记录个数;
(2)记录本身的大小;
(3)关键字的结构及初始状态;
(4)对排序稳定性的要求;
(5)存储结构。