计数排序没弄明白 求大神解答

#include
#include
//计数排序 会损耗空间
#define N 100000
void sort(int*a,int lengh)
{
int helper[N],source[N],i=0,k=0;
memset(helper,0,sizeof(helper));
memset(source,0,sizeof(helper));
for(i;i {
helper[a[i]]++;
}
for(i=0;i {
while(helper[i]>0)
{
printf("%d %d",k,i);
source[k++]=i;
// printf("%d %d",k,i);
helper[i]--;
printf("\n");
}
}
for(i=0;i<lengh;i++)
printf("%d",source[i]);
}
main()
{
int a[]={2,1,4,5,7,8,9}
//int a[]={36,54,89,78,21,56,42};
sort(a,sizeof(a)/4);
}
这计数排序只能识别个位数排序,能帮我改进一下吗?
如何提升输出效率?

代码放到代码片里,不然会有消失一部分代码

可以使用两个变量确定边界,这样输出的时候就不需要从0-N来判断

#include<stdio.h>
#include<string.h>
//计数排序 会损耗空间
#define N 100000
void sort(int* a, int lengh)
{
    int helper[N], source[N], i = 0, k = 0;
    int begin = N, end = 0;         
    memset(helper, 0, sizeof(helper));
    memset(source, 0, sizeof(helper));
    for (i = 0; i < lengh; i++) {
        helper[a[i]]++;
        if (a[i] < begin)
            begin = a[i];
        if (a[i] > end)
            end = a[i] + 1;
    }
    for (i = begin; i < end; i++) {
        while (helper[i] > 0)
        {
            printf("%d %d", k, i);
            source[k++] = i;
            // printf("%d %d",k,i);
            helper[i]--;
            printf("\n");
        }
    }
    for (i = 0; i < lengh; i++)
        printf("%d", source[i]);
}
int main()
{
    int a[] = { 2,1,4,5,7,8,9 };
        //int a[]={36,54,89,78,21,56,42};
    sort(a, sizeof(a) / 4);
    return 0;
}