基数排序详解及实例实现

一、什么是基数排序

基数排序(也叫桶排序)是一种很特别的排序方法,它不是基于比较进行排序的,而是采用多关键字排序思想(即基于关键字各位的大小进行排序的),借助“分配”和“收集”两种操作对单逻辑关键字进行排序。

基数排序又分为最高位优先(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 =&#
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值