C# 算法之基数排序排序(非比较排序之三)

划最重的重点:求最值,初新组,正反填充数组得

镇图

在这里插入图片描述

介绍

基数排序也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。

基数相对于其他排序,算法逻辑和代码都相对简单。
代码方面,也都是和另外两个排序的顺序一致。
与另外两个非比较排序不同的是:
计数排序和桶排序是基于数组索引来的,所以只能排序整数
但是基于数的计数而定,所以在改造后,理论上是也可以排序非整数

算法描述

算法描述
步骤1:求最值,取得数组中的最大数,并取得位数;
步骤2:初新组,此处新组是指新桶,桶大小为10(因为基数只有0-10);

步骤3:正填充,将对应基数的数字放到对应的桶中
步骤4:将桶中的数据反填充到array数组中
注:正反填充需要进行循环,循环次数为步骤一的位数

图片如下:
在这里插入图片描述

代码如下

        public int[] RadixSort2(int[] array)
        {
            //求最(大)值
            int max = array[0];
            foreach (var item in array)
            {
                max = item > max ? item : max;
            }

            int maxDigit = 0;
            while(max!=0)
            {
                max /= 10;maxDigit++;
            }
            //初新桶
            var bucket = new List<List<int>>();
            for (int i = 0; i < 10; i++)
            {
                bucket.Add(new List<int>());
            }
            
            for (int i = 0; i < maxDigit; i++)
            {
                //正填充
                int div = (int)Math.Pow(10, (i + 1));
                foreach (var item in array)
                {
                    //获取基数
                    int radix = (item % div) / (div / 10);
                    bucket[radix].Add(item);
                }
                //反填充(//反填充要注意顺序)
                int index = 0;
                foreach (var item in bucket)
                {
                    foreach (var it in item)
                    {
                        array[index++] = it;                        
                    }
                    item.Clear();//清除数据
                }                
            }
            return array;
        }

图源

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值