/*基数排序——LSD*/
/*一共10个桶,从个位开始,将元素按照每一位的数字分配到相应桶中,然后再重新收集,每次收集后,元素之间保持了相对位置(个位小的在前,经过重新分配后,依然保持个位小的在前)最后一次收集后元素将从小到大依次排列*/
#include <stdio.h>
#define digit 4 //几位数字,随便设置
#define bucket_size 10 //每个桶的容量
/*选取数字函数*/
int number(int s,int i)
{
int k = 0,p;
int cs;
p=s;
for(cs=0;cs<=i;cs++)
{
k=p%10;
p=(p-k)/10;
}//printf("%d\n",k);
return k;
}
int LSD_sort(int s[],int length)
{
int i,j,num,p,k;
int bucket[10][bucket_size];
/*向桶中插入元素,从低位向高位*/
for(i=0;i<digit;i++)
{
p=0;
int bucket_num[10]={0,0,0,0,0,0,0,0,0,0}; //记录每个桶里插入了多少元素
/*第一次为创建空桶,以后每次将桶清空*/
for (k=0;k<10;k++)
{
for (j=0;j<bucket_size;j++)
{
bucket[k][j]=0;
}
}
for(j=0;j<length;j++)
{
num=number(s[j],i);//选取数字
bucket[num][bucket_num[num]]=s[j];//将元素插入桶中
bucket_num[num]++;//相应桶的下一个位置
}
/*重新收集元素*/
for (j=0;j<10;j++)
{
int t=0;
while(bucket_num[j]!=0)
{
s[p]=bucket[j][t];
t++;
p++;
bucket_num[j]--;
}
}
}
return *s;
}
经典排序——基数排序LSD——C语言版
最新推荐文章于 2022-11-23 20:09:56 发布