基数排序

//----------------------------------------------
//        Author    :心海
//        Date      :2013-11-26
//        Blog      :http://blog.sina.com.cn/u/2116533530
//        Copyright :anyone
//        PS        :欢迎拍砖、指正。一起学习,共同进步。
//-----------------------------------------------

//堆排序问题
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>

//显示函数
//d控制位数,d<9
void Display(int *A,int n,int d)
   
    int i;
    char ch[4];
    ch[0]='%';
    ch[1]=(char)(d+48+1);
    ch[2]='d';
    ch[3]='\0';
    for(i=0;i<n;i++)
    {
        printf(ch,A[i]);
        if((i+1)==0)
            printf("\n");
    }
    printf("\n\n");
}

//基数排序
//A待排数组,n数组长度,d元素位数
void RadixSort(int *A,int n,int d)
{
    int *p[10];        //指针数组
    int a[10];        //数组
    int pp,i,j,k,m,q,reminder,count;
    for(pp=0;pp<d;pp++)
    {
        for(i=0;i<10;i++)
           a[i] = 1;
            count = (unsigned)sizeof(int) * a[i];
            p[i] = (int*)malloc(count);
        }

        for(j=0;j<n;j++)
        {
            reminder = ((double)A[j])/pow(10,pp);
            reminder = reminder;            //得到倒数第i位的数值
            switch(reminder)
            {
            case 1:
                a[1]+=1;
                p[1] = (int*)realloc(p[1],sizeof(int)*a[1]);
                p[1][a[1]-2] = A[j];
                break;
            case 2:
                a[2]+=1;
                p[2] = (int*)realloc(p[2],sizeof(int)*a[2]);
                p[2][a[2]-2] = A[j];
                break;
            case 3:
                a[3]+=1;
                p[3] = (int*)realloc(p[3],sizeof(int)*a[3]);
                p[3][a[3]-2] = A[j];
                break;
            case 4:
                a[4]+=1;
                p[4] = (int*)realloc(p[4],sizeof(int)*a[4]);
                p[4][a[4]-2] = A[j];
                break;
            case 5:
                a[5]+=1;
                p[5] = (int*)realloc(p[5],sizeof(int)*a[5]);
                p[5][a[5]-2] = A[j];
                break;
            case 6:
                a[6]+=1;
                p[6] = (int*)realloc(p[6],sizeof(int)*a[6]);
                p[6][a[6]-2] = A[j];
                break;
            case 7:
                a[7]+=1;
                p[7] = (int*)realloc(p[7],sizeof(int)*a[7]);
                p[7][a[7]-2] = A[j];
                break;
            case 8:
                a[8]+=1;
                p[8] = (int*)realloc(p[8],sizeof(int)*a[8]);
                p[8][a[8]-2] = A[j];
                break;
            case 9:
                a[9]+=1;
                p[9] = (int*)realloc(p[9],sizeof(int)*a[9]);
                p[9][a[9]-2] = A[j];
                break;
            default:
                a[0]+=1;
                p[0] = (int*)realloc(p[0],sizeof(int)*a[0]);
                p[0][a[0]-2] = A[j];
            }
        }

        for(q=0,k=0;q<10;q++)
        {
            for(m=0;m<a[q]-1;m++)
                A[k++] = *(p[q]+m);
        }
        printf("\n\t\t中间输出结果:\n");
        Display(A,n,d);
    }
}

int main()
{
    int *A;
    int n,i,d,depthMax;
    printf("请输入数组长度,数据位数: ");
    scanf("%d%d",&n,&d);
    depthMax = (int)pow(10,d) - 1;
    A = (int*)malloc((unsigned)(sizeof(int)*n));
    srand((unsigned)time(NULL));
    for(i=0;i<n;i++)
        A[i] = rand()�pthMax;

 
    Display(A,n,d);
    RadixSort(A,n,d);
    printf("\n\n\t\t最终输出结果: \n");
    Display(A,n,d);
    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值