基数排序思想:
- 数组中的每个数据先按照个位数的大小放入桶中
- 再从左往右,从下往上依次取出
- 数组中的每个数据再按照十位数的大小放入桶中
- 再从左往右,从下往上依次取出
- 重复上面步骤,直到最大数的位数完成排列
基数排序图解:
代码实现:
#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;
}