简介:
基数排序属于分配式排序,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用
基本思路:
将数字按位数分割成不同的数字,然后按大小进行桶排序
(从低位开始向高位排序,一直到最大位数,)
步骤图:
(图片来源:https://www.runoob.com/w3cnote/radix-sort.html)
代码:
int GetM(int data[], int n)
{
int Maxdata = data[0];
for (int i = 1; i < n; i++)
{
if (data[i] > Maxdata)
{
Maxdata = data[i];
}
}
int M = 1;
while (Maxdata >= 10)
{
Maxdata /= 10;
M++;
}
return M;
}
void RadixSort(int data[], int n)
{
int m = GetM(data, n); //获取最高位的位数,即排序的次数
int *temp = new int[n]; //临时存储数据的值
int Count[10]; //计数
int Radix = 1,k;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < 10; j++) //先清0
{
Count[j] = 0;
}
for (int j = 0; j < 10; j++) //记录个/十/百位出现的次数
{
k = (data[j] / Radix) % 10;
Count[k]++;
}
for (int j = 1; j < 10; j++) //记录对应的位置
{
Count[j] = Count[j - 1] + Count[j];
}
for (int j = 0; j < n; j++) //将Count中记录的位置分配到temp中
{
k = (data[j] / Radix) % 10;
temp[Count[k] - 1] = data[j];
Count[k]--;
}
for (int j = 0; j < n; j++) //将temp中的数据复制给数组中
{
data[n-1-j] = temp[j];
}
Radix *= 10;
}
delete[]temp;
}