c - 使用计数排序的基数排序

标签 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]);
        }
    }

最佳答案

循环的移动部分是从数组末尾移动到开始,这将不稳定。永远不会调用 digits 函数。 for(j=1; ... ) 应该是 for(j = 0; j < size; ... 下一个循环使用 c[i-1] 当 i 为零时。您可以改用 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 < size; ...) . – rcgldr

关于c - 使用计数排序的基数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30859766/

相关文章:

java - java数组的基本for循环操作?

java - 在没有数组的情况下对四个数字进行排序

c# - C# 中的 float 是否有一个好的基数排序实现

c - pthreads中的perlemed

c# - 亚音速 2.2 : how to order a collection by FK Title?

c - 基数排序循环错误

python - 为什么基数排序的空间复杂度为 O(k + n)?

c - 在 Windows 中启动失败的二进制文件未找到 Eclipse for C

c# - gcroot 和/clr 混合模式和 C++ 包装器是从纯 C 到 C# 的最短路径吗?

c++ - 什么是长指针?