试题四(共15 分) 阅读下列说明和C代码 回答问题 1 至问题3 将解答写在答题纸的对应栏内。 【说明】

计算机 元素,代码,个数 已帮助 人

试题四(共15 分)

阅读下列说明和C代码,回答问题 1 至问题3,将解答写在答题纸的对应栏内。

【说明】

某应用中需要对100000 个整数元素进行排序,每个元素的取值在 0~5 之间。排序算法的基本思想是:对每一个元素 x,确定小于等于 x的元素个数(记为m),将 x放在输出元素序列的第m 个位置。对于元素值重复的情况,依次放入第 m-l、m-2、…个位置。例如,如果元素值小于等于4 的元素个数有 10 个,其中元素值等于 4 的元素个数有3个,则 4 应该在输出元素序列的第10 个位置、第 9 个位置和第8 个位置上。

算法具体的步骤为:

步骤1:统计每个元素值的个数。

步骤2:统计小于等于每个元素值的个数。

步骤3:将输入元素序列中的每个元素放入有序的输出元素序列。

【C代码】

下面是该排序算法的C语言实现。

(1)常量和变量说明

R:常量,定义元素取值范围中的取值个数,如上述应用中 R值应取6i:循环变量

n:待排序元素个数

a:输入数组,长度为n

b:输出数组,长度为n

c:辅助数组,长度为R,其中每个元素表示小于等于下标所对应的元素值的个数。

(2)函数sort

1 void sort(int n,int a[ ],intb[ ]){

2 int c[R],i;

3 for (i=0;i< (1) ;i++){

4 c[i]=0;

5 }

6 for(i=0;i<n;i++){

7 c[a[i]] = (2) ;

8 }

9 for(i=1;i<R;i++){

10 c[i]= (3) ;

11 }

12 for(i=0;i<n;i++){

13 b[c[a[i]]-1]= (4) ;

14 c[a[i]]=c[a[i] ]-1;

15 }

16 }

【问题1】(8 分)

根据说明和C代码,填充 C代码中的空缺(1)~(4)。

【问题2】(4 分)

根据C代码,函数的时间复杂度和空间复杂度分别为 (5) 和 (6) (用 O符号

表示)。

【问题3】(3 分)

根据以上C代码,分析该排序算法是否稳定。若稳定,请简要说明(不超过 100 字);

若不稳定,请修改其中代码使其稳定(给出要修改的行号和修改后的代码)。

从下列的2 道试题(试题五和试题六)中任选 1 道解答。

如果解答的试题数超过 道,则题号小的 道解答有效。

热搜:党小组人数一般多少人15名党员用分党小组吗

答案解析

难度★★☆ 搜索
  • 参考答案:试题四分析本题考查算法设计与分析技术以及算法的c语言实现,是比较传统的题目,要求考生细心分析题目中所描述的内容。【问题1】根据题中说明,第3到第5行代码进行c数组的初始化,c数组的长度为R,在C语言中,下标从0开始,因此空格(1)中填写R。第6到第8行检查a数组的每一个元素。如果元素的值为i,则增加c[i]的值。因此c[a[i]]=c[a[i]]+1,空格(2)填写c[a[i]]+l。完成第6行到第8行的代码后,c[i]中就存放了等于i的元素的个数。第9到第11行,通过在数组c中记录计数和,c[i]=c[i-1]+c[i],可以确定对每一个i=0,1,…,R-l,有多少个元素是小于或等于i的。因此空格(3)填写c[i-1]+c[i]。第12行到第15行把数组a中每个元素a[i]放在输出数组b中与其相应的最终位置上,b[c[a[il]-1]=a[i],因此空格(4)填写a[i]。由于可能存在相同元素,因此每次将一个值a[i]放入数组b中时,都要减小c[i]的值。下面以一个例子来说明排序过程。设a={4,l,3,4,3,4},R=5,即待排序的元素值在{0,l,2,3,4}中,其排序过程如下图所示。图中(a)为输入数组a,(b)为初始化后的c数组,(c)为统计数组a中每个元素后的c数组,(d)为计数和,即统计小于等于i的元素个数后的c数组。(e)到(j)是将a数组中的元素依次放到b数组的过程,(k)是数组a和数组b的元素对应关系。 【问题2】根据上述C代码,第3到第5行代码的for循环所花时间为Θ(R)。第6到第8行的for循环所花时间为Θ(n)。第9到第11行的for循环所花时间为Θ(R)。第12到第15行for循环所花时间为Θ(n)。因此整个算法的时间复杂度为Θ(n+R)。若R远小于n或者R=Θ(n)时,时间复杂度可以表示为Θ(n)。【问题3】从图(k)可以看出,算法不稳定。算法不稳定的原因在于将数组a中元素放到数组b中时,是从数组a的第一个元素开始,依次取出元素放到数组b中。这样,相同的两个元素值,在数组a中的相对位置和在数组b中的相对位置正好相反。若从数组a的最后一个元素开始,依次向前取元素放到b数组中,可以保持相同元素的相对位置。因此将第12行的代码for(i=0;i<n;i++)改为for(i=n-1;i>0;i--),则排序算法是稳定的。参考答案(共15分)【问题1】(8分)(1)R (2)c[a[i]]+l (3)c[i]+c[i -1] (4)a[i] 【问题2】(4分)(5)O(n+R)或者O(n)或n或线性 (6)O(n+R)或者O(n)或n或线性 【问题3】(3分)不稳定。修改第12行的for循环为:for(i=n-1;i>=0;i--){即可。