参考答案:
【问题1】
(1)R
(2)c[a[i]]+1
(3)c[i]+c[i -1]
(4)a[i]
【问题2】
(5)O(n+R)或者O(n)或n或线性
(6)O(n+R)或者O(n)或n或线性
【问题3】
不稳定。修改第12行的for循环为:for(i=n-1;i>=0;i--)即可。
详细解析:
【问题1】
本题考查排序的相关内容。
题目告诉我们排序算法的基本思想是:对每一个元素x,确定小于等于x的元素个数(记为m),将x放在输出元素序列的第m个位置。对于元素值重复的情况,依次放入第m-1、m-2、…的位置。而且题目告诉我们算法的步骤。
下面我们来具体分析本试题。第(1)空所处的位置为函数sort()中第一个for循环中,从题目的描述和程序不难看出该循环的作用是给数组c赋初值,而根据题目描述可知数组c是一个辅助数组,长度为R,因此第一空应填R。
第(2)空在函数sort()中的第二个for循环中,很显然第(2)空是给数组c赋值,而且其下标为数组a的相应的元素值。再根据题目的描述“c数组中每个元素表示小于等于下标所对应的元素值的个数”,很显然,这个for循环的作用是统计每个元素值的个数,因此第(2)空的答案应该是c[a[i]]+1。
第(3)空在第三个for循环中,而且第(3)空是调整数组c的值,根据题目提供的算法的步骤,我们可知,这个时候应该要统计小于等于每个元素值的个数,而等于的元素个数记录在c[i]中,小于的元素个数记录在c[i-1]中,因此第(3)空的答案是c[i]+ c[i-1]。
第(4)空在最后一个for循环中,按题目要求,我们可以知道该for循环应该完成剩余的步骤3,即将输入元素序列中的每个元素放入有序的输出元素序列。而第(4)空是给数组b赋值,题目告诉我们b是输出数组,而a是输入数组,那么应该是将a中的值赋值值b中,因此第(4)空的答案应该为a[i]。
【问题2】
本题主要考查时间复杂度与空间复杂度的分析。
首先我们来看空间复杂度,空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。在sort()函数中,声明了两个整型变量n和i(可忽略),两个整型数组b和c,而a不属于函数sort的临时空间,因此函数sort()的空间复杂度为O(n+R),这里由于在本题中R的值为6,因此也可以忽略,所以答案也可以是O(n)。
接着我们来分析时间复杂度,时间复杂度是度量算法执行的时间长短,函数sort()中有并列的四个循环,其中有两个循环n次,而另外两个分别循环R-1和R次,因此时间复杂度应该为O(n+R),由于R的值为6,这里可以忽略,因此答案也可以是O(n)。
【问题3】
所谓稳定性是指两个关键字相等的元素在排序前后的相对位置不发生变化,一般来讲,只要排序过程中比较和移动操作发生在相邻的元素间,排序方法是稳定的。本题中的排序是不稳定的,可以修改第12行的for循环为:for(i=n-1;i>=0;i--)即可。