It seems a very trivial problem but after a lot of thinking I still can't figure it out. I worte these two codes for Radix sort.
Code 1
#include <stdio.h>
#include <malloc.h>
#define BUCKET_SIZE 10
void prin(int* arr,int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d ",*(arr+i));
    printf("\n");
}
int maxi(int* arr,int n)
{
    int i,max=0;
    for(i=0;i<n;i++)
    {
        if(arr[i]>max)
            max=arr[i];
    }
    return max;
}
int* count(int *arr,int n,int k)
{
    int* count,i,index;
    int* output;
    count=(int*)calloc(BUCKET_SIZE-1,sizeof(int));
    output=(int*)malloc(n*sizeof(int));
    for(i=0;i<n;i++)
    {
        index=(arr[i]/k)%10;
        count[index]++;
    }
    for(i=0;i<BUCKET_SIZE;i++)
        count[i]+=count[i-1];
    for(i=n-1;i>=0;i--)
    {
        index=(arr[i]/k)%10;
        output[count[index]-1]=arr[i];
        count[index]--;
    }
    return output;
}
int* radixsort(int* arr,int n)
{
    int i,max,k=1;
    max=maxi(arr,n);
    while(max>0)
    {
        max/=10;
        arr=count(arr,n,k);
        k=k*10;
    }
    return arr;
}
void main()
{
    int n,i;
    scanf("%d",&n);
    int* arr;
    arr=(int*)malloc(n*sizeof(int));
    for(i=0;i<n;i++)
        scanf("%d",(arr+i));
    arr=radixsort(arr,n);
    prin(arr,n);
}
Now if I change the sort subroutine like below, this code will not sort the given array and I can't figure why this happened, I am still traversing the whole array so and I am still calculating the right index so my elements should be filled in the right place and I should have a sorted array.
Code 2
Only count function last loop changed.
int* count(int *arr,int n,int k)
{
    int* count,i,index;
    int* output;
    count=(int*)calloc(BUCKET_SIZE-1,sizeof(int));
    output=(int*)malloc(n*sizeof(int));
    for(i=0;i<n;i++)
    {
        index=(arr[i]/k)%10;
        count[index]++;
    }
    for(i=0;i<BUCKET_SIZE;i++)
        count[i]+=count[i-1];
    for(i=0;i<n;i++)
    {
        index=(arr[i]/k)%10;
        output[count[index]-1]=arr[i];
        count[index]--;
    }
    return output;
}
When I am doing just counting sort both functions work well. Can someone point me out where I am going wrong with radix sort, or what is the thing I am missing, and how both well in counting sort.
Thanks.
 
     
    