基数排序

//----------------------------------------------
//              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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值