使用计数排序进行基数排序

时间:2015-06-16 05:54:29

标签: c sorting radix-sort counting-sort

这种基数排序算法使用计数排序作为其中所需的稳定排序。如果输入3个数字且数字较少的数字,则可以正确排序,但排序算法会停止工作以获得更高的输入值。提前致谢

   #include<stdio.h>
    int digits(int k)
    {
        int i=0;
        while(k!=0)
        {
            k=k/10;
            i++;
        }
        return i;
    }
    void radixsort(int a[],int size,int k)
    {
        int c[10],b[50],i,j,l,m=10,n=1;
        for(l=1;l<=k;l++)
        {
            if(l==1)
            {
                m=10;
                n=1;
            }
            else
            {
                m=m*10;
                n=n*10;
            }
            for(i=0;i<=9;i++)
            {
                c[i]=0;
            }
            for(j=1;j<=size;j++)
            {
                c[(a[j]%m)/n]=c[(a[j]%m)/n]+1;
            }
            for(i=0;i<=9;i++)
            {
                c[i]=c[i-1]+c[i];
            }
            for(j=size;j>=1;j--)
            {
                b[c[(a[j]%m)/n]]=a[j];
                c[(a[j]%m)/n]--;
            }
            for(i=1;i<=size;i++)
            {
                a[i]=b[i];
            }
        }
    }
    main()
    {
        int a[50],i,size,k=0;
        printf("enter the size of the array\n");
        scanf("%d",&size);
        printf("enter the numbers of the elements\n");
        for(i=1;i<=size;i++)
        {
            scanf("%d",&a[i]);
            if(k<a[i])
            k=a[i];
        }
        radixsort(a,size,k);
        for(i=1;i<=size;i++)
        {
            printf("%d\n",a[i]);
        }
    }

1 个答案:

答案 0 :(得分:0)

循环的移动部分从数组的末尾开始移动,这将不稳定。从不调用数字函数。 for(j = 1; ...)应该是(j = 0; j&lt; size; ...当i为零时,下一个循环使用c [i-1]。你可以使用int c [11]而不是c [10],并使用c [1+(a [...] ...] ++,然后在将计数转换为索引时忽略c [10](c [0] = 0,c [1] =#0's,c [2] =#0's +#1's,...),然后从开始到结束(j = 0; j&lt; size; ...)。 - rcgldr