基数排序俗称桶排序,它是一种低位优先的算法;就是所有的数据依次进桶,出桶,循环count次,而count为最大值的位数.
代码实现
void RadixSort(int* arr, int len)//O(d*n),O(n),稳定的
{
//需要利用10个队列,存放进队的数字
HNode queArr[10];//定义10个队头
for (int i = 0; i < 10; i++)
{
InitQueue(&queArr[i]);
}
//得到最大数字的位数,确定入队和出队的趟数
int count = GetFigur(arr, len);
int index;//队列的下标
for (int i = 0; i < count; i++)//i有两层含义:1.控制趟数2.处理每个数字从右往左的第i个数字
{
//入队
for (int j = 0; j < len; j++)//遍历arr数组并入队
{
index = GetNum(arr[j], i);//index是保存arr[j]应该进入的队列的下标
Push(&queArr[index], arr[j]);//将数字放入对应的队列
}
//依次出队
int j = 0;//arr的下标
for (int k = 0; k < 10; k++)
{
while (!IsEmpty(&queArr[k]))
{
Pop(&queArr[k], &arr[j++]);
}
}
}
for (int i = 0; i < 10; i++)
{
Destroy(&queArr[i]);
}
}
//获取最大数字的位数
static int GetFigur(int* arr, int len)
{
int max = arr[0];//max保存最大值
for (int i = 0; i < len; i++)
{
if (max < arr[i])
{
max = arr[i];
}
}
//丢弃个位
int count = 0;
while (max != 0)
{
count++;
max /= 10;
}
return count;
}
//获取十进制整数右数第figur位的数,figur从0开始
//例如(123,0)->3,(123,1)->2,(123,2)->1,(123,3)->0
static int GetNum(int n, int figur)
{
for (int i = 0; i < figur; i++)
{
n /= 10;
}
return n % 10;
}
基数排序的效率分析:
O(d*n),O(n),稳定;
注意:基数排序不能处理负数;