1、计算机专业基础综合(排序)模拟试卷 3 及答案与解析一、单项选择题1-40 小题,每小题 2 分,共 80 分。下列每题给出的四个选项中,只有一个选项是最符合题目要求的。1 下面给出的 4 种排序方法中,( )排序法是不稳定性排序法。(A)插入(B)冒泡(C)二路归并(D)堆2 下列内部排序算法中,其比较次数(或交换次数)与序列初态无关的算法是( )。(A)快速排序(B)直接插入排序(C)二路归并排序(D)冒泡排序3 下列内部排序算法中,在初始序列已基本有序(除去 n 个元素中的某 k 个元素后即呈有序,k (1) )算法,最费时间的是( (2) )算法。(A)堆排序 直接选择排序(B)冒泡排
2、序 直接插入排序(C)插入排序 快速排序(D)归并排序 希尔排序9 如果只想得到 1 000 个元素组成的序列中第 5 个最小元素之前的部分排序的序列,用( )方法最快。(A)冒泡排序(B)快速排序(C)简单选择排序(D)堆排序10 数据表 A 中有 10 000 个元素,如果仅要求求出其中最大的 10 个元素,则采用( )方法最节省时间。(A)堆排序(B)希尔排序(C)快速排序(D)直接选择排序11 若对序列(tang,deng ,an,wang,shi,bai,fang,liu)采用简单选择排序法按字典顺序进行排序,下面给出的四个序列中,第三趟的结果是( )。(A)an,bai,deng,
3、wang,tang,fang ,shi,liu(B) an,bai ,deng ,wang,shi,tang,fang,liu(C) an,bai ,deng ,wang,fang,shi,tang,liu(D)an,bai,deng,wang,shi,liu,tang,fang12 从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为( )排序法。(A)插入(B)选择(C)希尔(D)二路归并13 若用冒泡排序方法对序列10,14,26,29,41,52 从大到小排序,需进行( )次比较。(A)3(B) 10(C) 15(D)2514
4、 下列( ) 是一个堆。(A)19,75,34,26,97,56(B) 97,26,34,75,19,56(C) 19,56,26,97,34,75(D)19,34,26,97,56,7515 若一组记录的关键码为(46,79,56,38,40,84),则利用快速排序的方法,以第 1 个记录为基准得到的一次划分结果为( )。(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二、综合应用题41-47 小题,共 70 分。16 在执行某种排序算法的过程中出现了排序码朝着最终排序序列相反
5、的方向移动,从而认为该排序算法是不稳定的,这种说法对吗?为什么?17 设有 5 个互不相同的元素 a,b,c ,d,e,能否通过 7 次比较就将其排好序?如果能,请列出其比较迎程;如果不能,则说明原因。18 对一个由 n 个关键字不同的记录构成的序列,能否用比 2n 一 3 少的次数选出该序列中关键字取最大值和关键字取最小值的记录?请说明如何实现? 在最坏的情况下至少要进行多少次比较?19 利用比较的方法进行排序,在最坏的情况下能达到的最好时间复杂性是什么?请给出详细证明。20 已知下列各种初始状态(长度为 n)元素,试问当利用直接插入法进行排序时,至少需要进行多少次比较(要求排序后的文件按关
6、键字从大到小顺序排列)? (1)关键字自小到大有序(key 1key 2key n); (2)关键字自大到小逆序(key1key 2 key n); (3)奇数关键字顺序有序,偶数关键字顺序有序(key1key 3 ,key 2key 4); (4) 前半部分元素按关键字顺序有序,后半部分元素按关键字顺序逆序(key 1key 2key m, keym+1 key m+2key n,m为中间位置)。21 对于 n 个元素组成的线性表进行快速排序时,所需进行的比较次数与这 n 个元素的初始排序有关。问:(1)当 n=7 时,在最好情况下需进行多少次比较?请说明理由。(2)当 n=7 时,给出一个
7、最好情况的初始排序的实例。(3)当 n=7 时,在最坏情况下需进行多少次比较?请说明理由。(4)当 n=7 时,给出一个最坏情况的初始排序的实例。22 关于堆的一些问题:(1)堆的存储表示是顺序的,还是链接的?(2)设有一个最小堆,即堆中任意结点的关键字均大于它的左孩子和右孩子的关键字。其具有最大值的元素可能在什么地方?(3)对 n 个元素进行初始建堆的过程中,最多做多少次数据比较(不用大 O 表示法)?23 若有 N 个元素已构成一个小根堆,那么如果增加一个元素为 Kn+1,请用文字简要说明如何在 log2n 的时间内将其重新调整为一个堆。24 冒泡排序方法是把大的元素向上移(气泡的上浮),
8、也可以把小的元素向下移(气泡的下沉)。请给出上浮和下沉过程交替的冒泡排序算法。25 有一种简单的排序算法,叫做计数排序(Count sorting)。这种排序算法对一个待排序的表(用数组表示) 进行排序,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键字互不柜同,计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键字比该记录的关键字小。假设针对某一个记录,统计出的计数值为 c,那么,这个记录在新的有序表中的合适的存放位置即为 c。设计实现计数排序的算法。对于有 n 个记录的表,关键字的比较次数是多少?与简单选择排序相比较,这种方法是否更好?为什么?
9、26 某个待排序的序列是一个可变长度的字符串序列,这些字符串一个接一个地存储于唯一的字符数组中。请改写快速排序算法,对这个字符串序列进行排序。27 设有一个数组中存放了一个无序的关键字序列 K1,K 2,K n。现要求将 Kn放在将元素排序后的正确位置上,试编写实现该功能的算法,要求比较关键字的次数不超过 n。计算机专业基础综合(排序)模拟试卷 3 答案与解析一、单项选择题1-40 小题,每小题 2 分,共 80 分。下列每题给出的四个选项中,只有一个选项是最符合题目要求的。1 【正确答案】 D【试题解析】 此题考查的知识点是排序算法的稳定性问题。如果待排序的文件中,存在多个关键字相同的记录,
10、经过排序后这些具有相同关键字的记录之间的相对次序保持不变,则称这种排序是稳定的排序;反之,若具有相同关键字的记录之间的相对次序发生变化,则称这种排序是不稳定的排序。是否稳定与算法有关,相邻数据比较的算法是稳定的,不相邻数据比较会出现不稳定。选项 A、B 、C 都是相邻元素比较,是稳定的。所以选 D。【知识模块】 排序2 【正确答案】 C【试题解析】 此题考查的知识点是各类排序算法的思想。冒泡排序方法就是自底向上检查这个序列,若两个相邻的元素的顺序不对,则交换。直到所有元素处理完为止。与序列初态有关,D 错。直接插入排序思想是假设待排序的记录存放在数组 Rn+1中,排序过程中的某一时刻,R 被分
11、成两个子区间R1,Ri 1和Ri,Rn,其中,前一个子区间是已排好序的有序区;后一个子区间是当前未排序的无序区。直接插入排序的基本操作是将当前无序区的第 i 个记录 Ri插入到有序区中的适当位置,使得 R1到Ri变为新的有序区。首先比较 Ri和 Ri1,如果 Ri1Ri,则 R1i已排好序,第 i 遍处理就结束了;否则交换 Ri与 Ri1的位置,继续比较 Ri1和 Ri 一 2,直到找到某一个位置 j(1ji1)使得 RjRj+1时为止。与序列初态有关,B 错。快速排序是通过基准元素 v 把表(文件,数据集合)划分成左、右两部分,使得左边的各记录的关键字都小于 v;右边的各记录的关键字都大于等
12、于 v;重复该过程直到排好序。与序列初态有关,A 错。二路归并是首先把每个记录看成是一个有序序列,共 n 个,将它们两两合并成n2个分类序列,每个序列长度为 2(当 n 为奇数时,最后一个序列长度为 1);对n2个分类序列,再两两归并在一起;如此进行,直到归并成一个长度为 n 的分类序列为止。与序列初态无关,所以选 C。【知识模块】 排序3 【正确答案】 C【试题解析】 此题考查的知识点是各类排序算法的效率。起泡排序比较 n(n1)2 次,没有交换次数;堆排序一次比较 log2n 次,共需要凡轮;直接插入排序比较 n 一 1 次,没有交换;二路归并排序一次比较 log2n 次,共需要 n 轮。
13、综上,应选 C。【知识模块】 排序4 【正确答案】 C【试题解析】 本题考查各种内部排序算法的比较,考生一定要熟记下面这张表格。【知识模块】 排序5 【正确答案】 A【试题解析】 由这些排序方法的特点可知本题答案为 A。【知识模块】 排序6 【正确答案】 C【试题解析】 此题考查的知识点是各类排序算法的思想。应选 c。【知识模块】 排序7 【正确答案】 A【试题解析】 此题考查的知识点是各类排序算法的思想。应选 A。【知识模块】 排序8 【正确答案】 C【试题解析】 此题考查的知识点是各类排序算法的思想。应选 C。【知识模块】 排序9 【正确答案】 D【试题解析】 此题考查的知识点是各类排序算
14、法的思想。冒泡排序和简单选择排序每次要比较 ni 次,快速排序结束后才能得到结果,堆排序可以在选择 5 次后得到结果,每次比较元素次数为 log2n。所以应选 D。【知识模块】 排序10 【正确答案】 A【试题解析】 只有堆排序每次输出一个堆顶元素(即最大或最小值的元素),然后对堆再进行调整,保证堆顶元素总是当前剩下元素的最大或最小的,本题答案为A。【知识模块】 排序11 【正确答案】 B【试题解析】 本题根据简单选择排序法的算法思想可得答案 B。【知识模块】 排序12 【正确答案】 A【试题解析】 此题考查的知识点是各类排序算法的思想。应选 A。【知识模块】 排序13 【正确答案】 C【试题
15、解析】 此题考查的知识点是冒泡算法的思想及过程。第一趟比较 5 次,第2 趟比较 4 次,第 3 趟比较 3 次,第 4 趟比较 2 次,第 5 趟比较 1 次,结束。共 15次,应选 C。【知识模块】 排序14 【正确答案】 D【试题解析】 D。完全二叉树中所有非终端结点的值均不大于 (或不小于)其左、右孩子结点的值,则此序列可称为堆。据此,可画出二叉树,如下图所示: 得出答案为 D。【知识模块】 排序15 【正确答案】 C【试题解析】 对于(46,79,56,38,40,84),取出 46,对(79,56 ,38,40,84) 进行划分,先将 79 与 40 交换,得到(40,56,38,
16、79,84),再将 56 与 38 交换,得到(40,38,56,79,84),将 46 插入得到(40,38 ,46,56,79,84),本题答案为 C。【知识模块】 排序二、综合应用题41-47 小题,共 70 分。16 【正确答案】 这种说法不对。因为排序的不稳定性是指两个关键字值相同的元素的相对次序在排序前后发生了变化,而题中叙述和排序中稳定性的定义无关,所以此说法不对。【知识模块】 排序17 【正确答案】 可以做到。取 a 与 b 进行比较,c 与 d 进行比较。设ab,cd(ad,则有序 abd;若 bdb,此时已进行了 3 次比较。再把另外两个元素按折半插入排序方法,插入到上述某
17、个序列中共需 4 次比较,从而共需 7 次比较。【知识模块】 排序18 【正确答案】 将 n 个元素对称比较,即第一个元素与最后一个元素比较,第二个元素与倒数第二个元素比较比较中的小者放前半部,大者放后半部,用了n2 次比较。再在前后两部分中分别简单选择最小和最大元素,各用(n2)一 1 次比较。总共用了(3n2) 一 2 次比较。显然,当 n3 时,(2n 一 3)(3n2) 一 2。 用分治法求解再给出另一参考答案。 对于两个数 x 和 y,经一次比较可得到最大值和最小值;对于三个数 x,y,z,最多经 3 次比较可得最大值和最小值;对于凡个数(n3),将分成长为 n 一 2 和 2 的前
18、后两部分 A 和 B,分别找出最大者和最小者:Max A,Min A,Max B,Min B,最后 Max=Max A,Max B和 Min=Min A,MinB 。对 A 使用同样的方法求出最大值和最小值,直到元素个数不超过 3。 设 C(n)是所需的最多比较次数,根据上述原则,当 n3 时有如下关系式: 通过逐步递推,可以得到:C(n)=(3n2)一 2。显然,当 n3 时, 2n 一 3(3n2)一 2。事实上(3n2)一 2 是解决这一问题的比较次数的下限。【知识模块】 排序19 【正确答案】 假定待排序的记录有 n 个。由于含 n 个记录的序列可能出现的状态有 n!个,则描述 n 个
19、记录排序过程的判定树必须有 n!个叶子结点。因为若少一个叶子,则说明尚有两种状态没有分辨出来。我们知道,若二叉树高度是 h,则叶子结点个数最多为 2h-1;反之,若有 u 个叶子结点,则二叉树的高度至少为(log 2u)+1。这就是说,描述 n 个记录排序的判定树必定存在一条长度为 log2(n!)的路径。即任何一个借助“ 比较” 进行排序的算法,在最坏情况下所需进行的比较次数至少是log2(n!)。根据斯特林公式,有 log2(n!)=O(nlog2n)。即借助于“ 比较”进行排序的算法在最坏情况下能达到的最好时间复杂度为 O(nlog2n)。 提示:此题考查的知识点是基于比较的排序算法效率
20、。【知识模块】 排序20 【正确答案】 本题主要考查直接插入法的算法思想及性能分析。根据题目所给出的条件,最好情况下的比较次数即为最少比较次数。(1)在关键字自小到大有序的情况下,插入第 i 个(2in) 元素的比较次数为 1,因此,总的比较次数为 1+1+1+1=n 一 1。(2)在关键字自大到小有序的情况下,插入第 i 个(2in) 元素的比较次数为 i,因此,总的比较次数为 2+3+4+n=n(n+1)2一 1=(n 一 1)(n+2)2。(3)在奇数关键字顺序有序和偶数关键字顺序有序的情况下,比较次数最少的情况是所有记录关键字均按升序排列,这时,总的比较次数为 n 一 1。(4)在前半
21、部分元素按关键字有序,后半部分按关键字逆序的情况下,后半部分元素的关键字均大于前半部分元素的关键字时比较次数最少,此时前半部分的比较次数为 m1,后半部分的比较次数为(n 一 m1)(n 一 m+2)2,因止匕,总的比较次数为 m 一 1+(n 一 m 一 1)(n 一 m+2)2=(n 一 2)(n+8)8(假设 n 为偶数,m=n 2)。【知识模块】 排序21 【正确答案】 (1)在最好情况下,假设每次划分能得到两个长度相等的子文件,文件的长度 n=2k 一 1,那么第一遍划分得到两个长度均为*91的子文件,第二遍划分得到 4 个长度均为的子文件,以此类推,总共进行 k=log2(n+1)
22、遍划分,各子文件的长度均为 1,排序完毕。当 n=7 时,后=3 ,在最好情况下,第一遍需比较 6次,第二遍分别对两个子文件(长度均为 3,k=2) 进行排序,各需 2 次,共 10 次即可。 (2)在最好情况下快速排序的原始序列实例:4,1,3,2,6,5,7。 (3)在最坏情况下,若每次用来划分的记录的关键字具有最大值(或最小值),那么只能得到左(或右 ) 子文件,其长度比原长度少 1。因此,若原文件中的记录按关键字递减次序排列,而要求排序后按递增次序排列时,快速排序的效率与冒泡排序相同,其时间复杂度为 O(n2)。所以当 n=7 时,最坏情况下的比较次数为 21 次。 (4)在最坏情况下
23、快速排序的初始序列实例:7,6,5,4,3,2,1,要求按递增排序。 提示:此题考查的知识点是快速排序的思想。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。【知识模块】 排序22 【正确答案】 (1)堆的存储是顺序的。 (2) 最大值元素一定是叶子结点,在最下两层上。 (3)在建含有 n 个元素、深度为 h 的堆时,其比较次数不超过 4n,推导如下: 由于第 i 层上的结点数至多是 2i-1,以它为根的二叉树的深度为 h 一 i
24、+1,则调用*92次筛选算法时总共进行的关键字比较次数不超过下式之值: 提示:此题考查的知识点是堆的基本定义及效率。堆定义为 n 个关键字序列K1,K 2,K n 当且仅当该序列满足如下性质(简称为堆性质 ): (1)k iK2i 且kiK2i+1 或 (2)k iK2i 且 kiK2i+1(1in)。k i 相当于二叉树的非叶结点, K2i 则是左孩子,k 2i+1 是右孩子。【知识模块】 排序23 【正确答案】 K 1K n 是堆,在 Kn+1 加入后,将 K1Kn+1 调成堆。设 c=n+1,若 KfKc,则调整完成。否则 Kf 与 Kc 交换之后,c=f, 继续比较,直到 KfKc,或
25、 f=0,即为根结点,调整结束【知识模块】 排序24 【正确答案】 void BubbleSort2(int a,int n) 相邻两趟向相反方向起泡的冒泡排序算法int change=1;low=0;high=n 1; 冒泡的上下界while(lowai+1)aiai+1;change=1; 有交换,修改标志changehigh 一一; 修改上界for(i=high;ilow;i 一一) 从下向上起泡if(ai=x)j-一;if(ij)Ri=Rj;while(ij&Rikey=x)i+;if(ij)Rj=Ri; whileRi=R0;return;提示:此题考查的知识点是快速排序的思想。【知识模块】 排序27 【正确答案】 int Partition(RecType K,int m,int n) 交换记录子序列K1 n中的记录,使枢轴记录到位,并返回其所在位置 此时,在它之前(后)的记录均不大(小) 于它 int i=m ,j=n,K0=Kj,x=Kjkey; while(i=x)j 一一; if(in 为枢轴的一趟快速排序。以最后一个关键字为枢轴先从前向后再从后向前快速排序。【知识模块】 排序