一、前言
数据结构与算法,顺便刷leetcode,无意间发现了一个 我觉得讲解的比较好的网页,并且会拿leetcode里面的题目当做例题,如有需要,奉上网址:五分钟学算法
二、算法的思想
基数排序是一种非比较型排序算法,其原理是,将整数按位数切割成不同的数字,然后逐位比较。
三、算法的步骤
- 按照个位数进行排序:根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中。
- 将这些桶子中的数值重新串接起来,按照十位数进行排序:
- 将这些桶子中的数值重新串接起来,按照百位数进行排序。
四、算法的图示(图片来源于网络)
五、代码
void RadixSort(int* data,int size)
{
int p=1;
int d=1;
for(int i=0;i<size;i++)//计算位数
if(data[i]>p)
{
p*=10;
d++;
}
for(int j=0;j<d;j++)//逐位排序
{
int tmp[size];
int count[10];
int Radix=1;
for(int i=0;i<10;i++)初始化计数器
count[i]=0;
for(int i=0;i<size;i++)计数器技术
{
int k=(data[i]/Radix)%10;
count[k]++;
}
for(int j=1;j<10;j++)排序序号
count[j]=count[j]+count[j-1];
for(int i=size-1;i>=0;i++)//排序
{
int k=(data[i]/Radix)%10;
tmp[count[k]-1]=data[i];
count[k]--;
}
Radix*=10;//位数递增
for(int i=0;i<size;i++)//将结果存入data
data[i]=tmp[i];
}
}
六、算法的性质
- 稳定性:相同元素存放在统一桶中,不改变相对位置,稳定。
- 空间复杂度:O(n+k)
- 时间复杂度:O(d*2n)