【数据结构】八大排序算法---基数排序(桶排序)

基数排序思想:

  1. 数组中的每个数据先按照个位数的大小放入桶中
  2. 再从左往右,从下往上依次取出
  3. 数组中的每个数据再按照十位数的大小放入桶中
  4. 再从左往右,从下往上依次取出
  5. 重复上面步骤,直到最大数的位数完成排列

基数排序图解:

代码实现:

#include<math.h>
#include<stdio.h>
void ShowArr(int arr[],int len)
{
   int i=0;
   for(i;i<len;i++)
   {
      printf("%d ",arr[i]);
   }
   printf("\n"); 
}

int GetMaxNumFin(int arr[],int len)//找最大数,最大数的位数就是排序的趟数
{
   int max=-1;
   int i=0;
   int count=0;
   for(i;i<len;i++)
   {
      if(arr[i]>max)
      {
         max=arr[i];
      }
   }
   while(max!=0)
   {
      max/=10;
      count++;
   }
   return count;
}

int GetFinNumber(int val;int pos)//获取对应位数的数字,比如获取数组所有数字的个位,十位,百位
{
    //(pow(10.0,pos)求次方的函数  个位pos=0,10的0次方=1  十位pos=1,10的1次方=10
    //2346/1%10=6   2346/10=234%10=4
    return val/(int)(pow(10.0,pos))%10;
}

void Radix(int arr[],int len,int fin)//fin表示位数0个位 1十位
{ 
   int *buckect[10];//10个桶  指针数组
   int i=0;
   int finnum;//代表位数的数字
   int count[10];//代表每个桶当前可插入元素的下标,当前桶中的元素
   for(i;i<10;i++)
   {
      buckect[i]=(int*)malloc(sizeof(int)*(len));//给桶里的数据动态开辟内存
   }
   for(i=0;i<len;i++)//入桶
   {
      finnum=GetFinNumber(arr[i];fin);
      buckect[finum][count[finum]]=arr[i];
      count[finum]++;
   }
   int arrindex=0;//数据存放的数组起始下标
   int buckectindex=0;//每个桶起始的下标
   for(i=0;i<10;i++)//从桶中拿出来
   {
      buckectindex=0;
      while(count[i]!=0)
      {
         arr[arrindex]=buckect[i][bucketindex];
         buckectindex++;
         arrindex++;
         count[i]--;
      }
   }
   for(i=0;i<10;i++)
   {
      free(buckect[i]);
   }
}

void RadixSort(int arr[],int len)
{
  int MaxFin=GetMaxNumFin(arr,len);//获取最大数的位数
  int i=0;
  for(i;i<MaxFin;i++)
  {
     Radix(arr,len,i);
  }
}

int main()
{
  int arr[]={15,3,2,447,26,876,2347,7};
  int len=sizeof(arr)/sizeof(arr[0]);
  ShowArr(arr,len);
  RadixSort(arr,len);
  ShowArr(arr,len);
  return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值