排序算法-基数排序

一、介绍

  基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。

二、实现步骤

  1. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
  2. 然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

  基数排序的时间复杂度是O(k·n),其中n是排序元素个数,k是数字位数。注意这不是说这个时间复杂度一定优于O(n·log(n)),k的大小取决于数字位的选择(比如比特位数),和待排序数据所属数据类型的全集的大小;k决定了进行多少轮处理,而n是每轮处理的操作数目。
  如果考虑和比较排序进行对照,基数排序的形式复杂度虽然不一定更小,但由于不进行比较,因此其基本操作的代价较小,而且在适当选择的B之下,k一般不大于logn,所以基数排序一般要快过基于比较的排序,比如快速排序。

三、代码实现

/**
 * 基数排序,运用了计数排序的思想进行每轮的排序
 * 前提:数据位正整数
 */
public class RadixSort {

    public static void sort(int[] arr){
        int digit = maxbit(arr);
        int[] temp = new int[arr.length];
        int[] count = new int[10];

        int i, j, numberOfBucket;
        int radix = 1;
        for (i = 0; i <= digit; i++){
            //清零计数器
            for (j = 0; j < 10; j++)
                count[j] = 0;

            //统计每个桶的记录数
            for (j = 0; j < arr.length; j++){
                numberOfBucket = (arr[j] / radix) % 10;
                count[numberOfBucket]++;
            }

            for (j = 1; j < count.length; j++)
                count[j] += count[j - 1];

            for (j = arr.length - 1; j >= 0; j--){
                numberOfBucket = (arr[j] / radix) % 10;
                temp[count[numberOfBucket] - 1] = arr[j];
                count[numberOfBucket]--;
            }

            //将排序的中间结果拷贝到arr
            for (j = 0; j < temp.length; j++)
                arr[j] = temp[j];

            radix *= 10;
        }
    }

    private static int maxbit(int[] arr){
        int maxData = arr[0];
        //先求出最大数,再求其位数
        for (int num : arr) {
            if (num > maxData)
                maxData = num;
        }

        int d = 0;
        while(maxData != 0){
            maxData /= 10;
            d++;
        }

        return d;
    }
}

三、参考资料

  1. 维基百科
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值