一、什么是基数排序
基数排序(也叫桶排序)是一种很特别的排序方法,它不是基于比较进行排序的,而是采用多关键字排序思想(即基于关键字各位的大小进行排序的),借助“分配”和“收集”两种操作对单逻辑关键字进行排序。
基数排序又分为最高位优先(MSD)排序和最低位优先(LSD)排序
最低位用的比较多
是根据键值的每位数字来分配桶的
中r为所采取的基数,而n为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
二、动图演示
*动图来自菜鸟教程
三、实现方式
以低位(LSD)为例
从低位到高位的顺序进行排序
例如最高是百位的话,先从个位开始排序,然后是十位,最后是百位,如动图所示
四、关于基数排序的性能参数
1、时间复杂度
O ( r ) O(r) O(r)
2、空间复杂度
O ( d ( n + r ) ) O(d(n+r)) O(d(n+r))
3、是否稳定
稳定
4、适用于何类型存储
顺序存储和链式存储
五、代码实现
算法
c++
void RadixSort(int arr[], int length)
{
int MaxIndex = FindMax(arr,length); //得到最大数的位数
int *buckets = new int[10]; //定义桶,创建10个是因为桶的编号对应当前位数0-9
int *tmp = new int[length];
int i, j, radix = 1;
int temp;
for (i = 0; i < MaxIndex; i++) //进行位数次数的排序
{
// 给桶赋初值
for (j = 0; j < 10; j++)
{
buckets[j] = 0;
}
// 统计每个桶里的元素出现的次数
for (j = 0; j < length; j++)
{
temp = (arr[j] /radix ) %10;
/* ( A[j] / radix ) %10的作用
例如第一个数是13,则 temp=(13/1)%10 == 3
第四个数是100,
第一轮循环radix = 1时 temp = (100/1)%10 =&#