资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
第 8 章 排序技术
课后习题讲解
1. 填空题
⑴ 排序的主要目的是为了以后对已排序的数据元素进行( ) 。
【解答】查找
【分析】对已排序的记录序列进行查找一般能提高查找效率。
⑵ 对n个元素进行起泡排序, 在( ) 情况下比较的次数最少, 其比较次数为( ) 。在( ) 情况下比较次数最多, 其比较次数为( ) 。
【解答】正序, n-1, 反序, n(n-1)/2
⑶ 对一组记录( 54, 38, 96, 23, 15, 72, 60, 45, 83) 进行直接插入排序, 当把第7个记录60插入到有序表时, 为寻找插入位置需比较( ) 次。
【解答】3
【分析】当把第7个记录60插入到有序表时, 该有序表中有2个记录大于60。
⑷ 对一组记录( 54, 38, 96, 23, 15, 72, 60, 45, 83) 进行快速排序, 在递归调用中使用的栈所能达到的最大深度为( ) 。
【解答】3
⑸ 对n个待排序记录序列进行快速排序, 所需要的最好时间是( ) , 最坏时间是( ) 。
【解答】O(nlog2n), O(n2)
⑹ 利用简单选择排序对n个记录进行排序, 最坏情况下, 记录交换的次数为( ) 。
【解答】n-1
⑺ 如果要将序列( 50, 16, 23, 68, 94, 70, 73) 建成堆, 只需把16与( ) 交换。
【解答】50
⑻ 对于键值序列( 12, 13, 11, 18, 60, 15, 7, 18, 25, 100) , 用筛选法建堆, 必须从键值为( ) 的结点开始。
【解答】60
【分析】60是该键值序列对应的完全二叉树中最后一个分支结点。
2. 选择题
⑴ 下述排序方法中, 比较次数与待排序记录的初始状态无关的是( ) 。
A插入排序和快速排序 B归并排序和快速排序
C选择排序和归并排序 D插入排序和归并排序
【解答】C
【分析】选择排序在最好、 最坏、 平均情况下的时间性能均为O(n2), 归并排序在最好、 最坏、 平均情况下的时间性能均为O(nlog2n)。
⑵ 下列序列中, ( ) 是执行第一趟快速排序的结果。
A [da, ax, eb, de, bb] ff [ha, gc] B [cd, eb, ax, da] ff [ha, gc, bb]
C [gc, ax, eb, cd, bb] ff [da, ha] D [ax, bb, cd, da] ff [eb, gc, ha]
【解答】A
【分析】此题需要按字典序比较, 前半区间中的所有元素都应小于ff, 后半区间中的所有元素都应大于ff。
⑶ 对初始状态为递增有序的序列进行排序, 最省时间的是( ) , 最费时间的是( ) 。已知待排序序列中每个元素距其最终位置不远, 则采用( ) 方法最节省时间。
A 堆排序 B插入排序 C快速排序 D 直接选择排序
【解答】B, C, B
【分析】待排序序列中每个元素距其最终位置不远意味着该序列基本有序。
⑷ 堆的形状是一棵( ) 。
A二叉排序树 B满二叉树 C完全二叉树 D 判定树
【解答】C
【分析】从逻辑结构的角度来看, 堆实际上是一种完全二叉树的结构。
⑸ 当待排序序列基本有序或个数较小的情况下, 最佳的内部排序方法是( ) , 就平均时间而言, ( ) 最佳。
A 直接插入排序 B 起泡排序 C简单选择排序 D快速排序
【解答】A, D
⑹ 设有5000个元素, 希望用最快的速度挑选出前10个最大的, 采用( ) 方法最好。
A快速排序 B堆排序 C希尔排序 D 归并排序
【解答】B
【分析】堆排序不必将整个序列排序即可确定前若干个最大( 或最小) 元素。
⑺ 设要将序列( Q, H, C, Y, P, A, M, S, R, D, F, X) 中的关键码按升序排列, 则( ) 是起泡排序一趟扫描的结果, ( ) 是增量为4的希尔排序一趟扫描的结果, ( ) 二路归并排序一趟扫描的结果, ( ) 是以第一个元素为轴值的快速排序一趟扫描的结果, ( ) 是堆排序初始建堆的结果。
A( F, H, C, D, P, A, M, Q, R, S, Y, X)
B( P, A, C, S, Q, D, F, X, R, H, M, Y)
C( A, D, C, R, F, Q, M, S, Y, P, H, X)
D( H, C, Q, P, A, M, S, R, D, F, X, Y)
E( H, Q, C, Y, A, P, M, S, D, R, F, X)
【解答】D, B, E, A, C
【分析】此题需要按字典序比较, 而且需要掌握各种排序方法的执行过程。
⑻ 排序的方法有很多种, ( ) 法从未排序序列中依次取出元素, 与已排序序列中的元素作比较, 将其放入已排序序列的正确位置上。( ) 法从未排序序列中挑选元素, 并将其依次放入已排序序列的一端。交换排序是对序列中元素进行一系列比较, 当被比较的两元素为逆序时, 进行交换; ( ) 和( ) 是基于这类方法的两种排序方法, 而( ) 是比( ) 效率更高的方法; ( ) 法是基于选择排序的一种方法, 是完全二叉树结构的一个重要应用。
A 选择排序 B 快速排序 C 插入排序
D 起泡排序 E 归并排序 F 堆排序
【解答】C, A, D, B, B, D, F
⑼ 快速排序在( ) 情况下最不利于发挥其长处。
A 待排序的数据量太大 B 待排序的数据中含有多个相同值
C 待排序的数据已基本有序 D 待排序的数据数量为奇数
【解答】C
【分析】快速排序等改进的排序方法均适用于待排序数据量较大的情况, 各种排序方法对待排序的数据中是否含有多个相同值, 待排序的数据数量为奇数或偶数都没有影响。
⑽ ( ) 方法是从未排序序列中挑选元素, 并将其放入已排序序列的一端。
A 归并排序 B 插入排序 C 快速排序 D 选择排序
【解答】D
3. 判断题
⑴ 如果某种排序算法是不稳定的, 则该排序方法没有实际应用价值。
【解答】错。一种排序算法适合于某种特定的数据环境, 有时对排序的稳定性没有要求。
⑵ 当待排序的元素很大时, 为了交换元素的位置, 移动元素要占用较多的时间, 这是影响时间复杂性的主要因素。
【解答】对。此时着重考虑元素的移动次数。
⑶ 对n个记录的集合进行快速排序, 所需要的附加空间是Ο(n)。
【解答】错。最坏情况下是Ο(n)。
⑷ 堆排序所需的时间与待排序的记录个数无关。
【解答】错。堆排序最好、 最坏及平均时间均为Ο(nlog2n), 是待排序的记录个数n的函数。一般来说, 待排序的记录个数越多, 排序所消耗的时间也就越多。
⑸ 设有键值序列( k1, k2, …, kn) , 当i>n/2时, 任何一个子序列( ki, ki+1,… , kn) 一定是堆。
【解答】对。当i>n/2时, ki, ki+1,… , kn 均是叶子结点, 因此一定是堆。
4.已知数据序列为(12, 5, 9, 20, 6, 31, 24), 对该数据序列进行排序, 写出插入排序、 起泡排序、 快速排序、 简单选择排序、 堆排序以及二路归并排序每趟的结果。
【解答】用上述排序方法的每趟结果如下:
5.对n=7, 给出快速排序一个最好情况和最坏情况的初始排列的实例。
【解答】最好情况: 4, 7, 5, 6, 3, 1, 2
最坏情况: 7, 6, 5, 4, 3, 2, 1
6.判别下列序列是否为堆, 如不是, 按照堆排序思想把它调整为堆, 用图表示建堆的过程。
⑴( 1, 5, 7, 25, 21, 8, 8, 42)
⑵( 3, 9, 5, 8, 4, 17, 21, 6)
【解答】序列⑴是堆, 序列⑵不是堆, 调整为堆( 假设为大根堆) 的过程如图8-5所示。
7.已知下列各种初始状态( 长度为n) 的元素, 试问当利用直接插入排序进行排序时, 至少需要进行多少次比较( 要求排序后的记录由小到大顺序排列) ?
⑴ 关键码从小到大有序( key1< key2< … < keyn) 。
⑵ 关键码从大到小有序( key1> key2> … > keyn) 。
⑶ 奇数关键码顺序有序, 偶数关键码顺序有序( key1< key3<…, key2 key4…) 。br />⑷ 前半部分元素按关键码顺序有序, 后半部分元素按关键码顺序有序, 即:
( key1< key2< … < keym, keym+1< keym+2< …
【解答】依题意, 最好情况下的比较次数即为最少比较次数。
⑴ 插入第i( 2≤i≤n) 个元素的比较次数为1, 因此总的比较次数为:
1+1+……+1=n-1
⑵ 插入第i( 2≤i≤n) 个元素的比较次数为i, 因此总的比较次数为:
2+3+……+n=(n-1)(n+2)/2
⑶ 比较次数最少的情况是所有记录关键码按升序排列, 总的比较次数为:
n-1
⑷ 在后半部分元素的关键码均大于前半部分元素的关键码时需要的比较次数最少, 总的比较次数为:
n-1
8.算法设计
⑴ 直接插入排序中寻找插入位置的操作能够经过折半查找来实现。据此写一个改进的插入排序的算法。
【解答】插入排序的基本思想是: 每趟从无序区中取出一个元素, 再按键值大小插入到有序区中。对于有序区, 当然能够采用折半查找来确定插入位置。具体算法如下:
mosimage}
⑵ 设待排序的记录序列用单链表作存储结构, 试写出直接插入排序算法。
【解答】本算法采用的存储结构是带头结点的单链表。首先找到元素的插入位置, 然后把元素从链表中原位置删除, 再插入到相应的位置处。具体算法如下:
⑶ 设待排序的记录序列用单链表作存储结构, 试写出简单选择排序算法。
【解答】参见8.2.2。
⑷ 对给定的序号j( 1<j<n) , 要求在无序记录A[1]~A[n]中找到按关键码从小到大排在第j位上的记录, 试利用快速排序的划分思想设计算法实现上述查找。
【解答】本算法不要求将整个记录进行排序, 而只进行查找第j个记录。
⑸ 写出快速排序的非递归调用算法。
【解答】先调用划分函数Quickpass( 划分函数同教材) , 以确定中间位置, 然后再借助栈分别对中间元素的左、 右两边的区域进行快速排序。
⑹ 一个线性表中的元素为正整数或负整数。设计算法将正整数和负整数分开, 使线性表的前一半为负整数, 后一半为正整数。不要求对这些元素排序, 但要求尽量减少比较次数。
【解答】本题的基本思想是: 先设置好上、 下界和轴值, 然后分别从线性表两端查找正数和负数, 找到后进行交换, 直到上下界相遇。算法如下:
⑺ 已知( k1, k2, …, kn) 是堆, 试写一算法将( k1, k2, …, kn, kn+1) 调整为堆。
【解答】增加一个元素应从叶子向根方向调整, 假设调整为小根堆。
⑻ 给定n个记录的有序序列A[n]和m 个记录的有序序列B[m], 将它们归并为一个有序序列, 存放在C[m+n]中, 试写出这一算法。
【解答】采用二路归并排序中一次归并的思想, 设三个参数i、 j和k分别指向两个待归并的有序序列和最终有序序列的当前记录, 初始时i、 j分别指向两个有序 序列的第一个记录, 即i=1, j=1, k指向存放归并结果的位置, 即k=1。然后, 比较i和j所指记录的关键码, 取出较小者作为归并结果存入k所指位置, 直至两个有序序列之一的所有记录都取完, 再将另一个有序序列的剩余记录顺序送到归并后的有序序列中。
6. 用直接插入排序对下面四个序列进行由小到大排序, 元素比较次数最少的是( ) 。
A 94, 32, 40, 90, 80, 46, 21, 69 B 21, 32, 46, 40, 80, 69, 90, 94
C 32, 40, 21, 46, 69, 94, 90, 80 D 90, 69, 80, 46, 21, 32, 94, 40
【解答】B
7. 对数列( 25, 84, 21, 47, 15, 27, 68, 35, 20) 进行排序, 元素序列的变化情况如下:
⑴ 25, 84, 21, 47, 15, 27, 68, 35, 20 ⑵ 20, 15, 21, 25, 47, 27, 68, 35, 84
⑶ 15, 20, 21, 25, 35, 27, 47, 68, 84 ⑷ 15, 20, 21, 25, 27, 35, 47, 68, 84
则采用的排序方法是( ) 。
A 希尔排序 B 简单选择排序 C 快速排序 D 归并排序
【解答】C
8. 如果只想得到一个序列中第k个最小元素之前的部分排序序列, 最好采用什么排序方法? 为什么? 对于序列{57, 40, 38, 11, 13, 34, 48, 75, 25, 6, 19, 9, 7}, 得到其第4个最小元素之前的部分序列{6,7,9,11}, 使用所选择的排序算法时, 要执行多少次比较?
【解答】采用堆排序最合适, 依题意可知只需取得第k个最小元素之前的排序序列时, 堆排序的时间复杂度Ο(n+klog2n), 若k≤nlog2n, 则得到的时间复杂性是Ο(n)。
对于上述序列得到其前4个最小元素, 使用堆排序实现时, 执行的比较次数如下:
初始建堆: 比较20次, 得到6;
第一次调整: 比较5次, 得到7;
第二次调整: 比较4次, 得到9;
第三次调整: 比较5次, 得到11。
9.荷兰国旗问题。要求重新排列一个由字符R, W, B( R代表红色, W代表白色, B代表兰色, 这都是荷兰国旗的颜色) 构成的数组, 使得所有的R都排在最前面, W排在其次, B排在最后。为荷兰国旗问题设计一个算法, 其时间性能是O(n)。
【解答】设立三个参数i、 j、 k, 其中i以前的元素全部为红色; j表示当前元素; k以后的元素全部为蓝色。这样, 就能够根据j的颜色, 把其交换到序列的前部或后部。
具体算法如下:
10. 已知记录序列A[1] ~ A[n]中的关键码各不相同, 可按如下方法实现计数排序: 另设一个数组C[1] ~ C[n], 对每个记录A[i], 统计序列中关键码比它小的记录个数C[i], 则C[i]=0的记录必为关键码最小的记录, C[i]=1的记录必为关键码次 小的记录, 依此类推, 即按C[i]值的大小对A中记录进行重新排列。试编写算法实现上述计数排序。
【解答】具体算法如下:
11. 对于记录序列A[1] ~ A[n]可按如下如下方法实现奇偶交换排序: 第一趟对所有的奇数i, 将A[i]和A[i+1]进行比较, 第二趟对所有的偶数i, 将A[i]和A[i+1] 进行比较, 每次比较时若A[i]>A[i+1], 则将二者交换, 然后重复上述排序过程, 直至整个数组有序。编写算法实现上述奇偶交换排序。
【解答】具体算法如下:
展开阅读全文