阅读以下说明和C代码,填写程序中的空缺,将解答写入答题纸的对应栏内。
【说明】
规定整型数组a中的元素取值范围为[0,N),函数usrSort( int n, int a[] )对非负整型数组a的前n个元素进行计数排序。排序时,用temp_arr[i]表示i在数组a中出现的次数, 因此可以从0开始按顺序统计每个非负整数在a中的出现次数,然后对这些非负整数按照从小到大的顺序,结合其出现次数依次排列。
例如,对含有10个元素{0,8,5,2,0,1,4,2,0,1}的数组a[]排序时,先计算出有3个0、2 个1、2个2、1个4、1个5和1个8,然后可确定排序后a的内容为{0,0,0,1,1,2,2,4,5,8}。
下面代码中用到的memset函数的原型如下,其功能是将p所指内存区的n个字节都设置为ch的值。
void*memset (void *p, int ch, size_t n);
【C代码】
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 101
void printArr(int a[],int n);
void usrSort(int n,int a[]);
int main()
{
int a[10]={0,8,5,2,0,1,4,2,0,1};
printArr (a,sizeof(a)/sizeof(int));
( 1 ) _; //调用usrSort()对数组a进行升序排序
printArr ( a,sizeof(a)/sizeof(int) );
return 0;
}
void printArr (int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ", a[i]);
printf("\n");
}
void usrSort(int n, int a[])
{
int i,k;
int *temp_arr; //用temp_arr[i]表示i在a中出现的次数
temp_arr=(int *)malloc(N*sizeof(int) );
if(!temp_arr) return;
//将所申请并由temp_arr指向的内存区域清零
memset(_ (2) _);
for(i=0;i<n;i++)
temp_arr[_( 3 ) ]++;
k=0;
for(i=0;i<N;i++){
int cnt; //cnt表示i在数组a中的出现次数
( 4 ) ;
while(cnt>0){
a[k]=i; //将i放入数组a的适当位置
( 5 ) ;
cnt--;
}
}
free(temp_arr);
}