排序算法之基数排序

来源百度百科

  基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

一、基本思想

  从低位开始将要排序的数组按照这一位的值放入对应编号0-9的桶中。等待低位排完得到一个序列,将这个序列放回原数组。再根据次低位重新放入相应的桶中,重复操作,至此排到最高位,此时从桶中取出的数据,即为排序后的数据。


二、过程

  1. 先找出数组中的最大值,以便确定最大的位数
  2. 从低位进行取值,将所有的数字根据对应位数的值放入对应的桶中
  3. 从桶中依次取出数据放入数组中
  4. 重复(2,3)步骤,直至取到最高位即可

   假设数组arr = {652,126,352,129,395,854,231,238,536},根据上面步骤操作如下

在这里插入图片描述


三、总结

代码:

/**
 * 基数排序
 * @Author: Han-YLun
 * @date 2019/4/27
 * @Version 1.0
 */
public class RadixSort {

    /**
     * 对数组进行基数排序
     * @param arr   需要排序的数组
     */
    public  static void radixSort(int[] arr){
        //获取数组中的最大值
        int max = findMax(arr,0,arr.length-1);
        int[][] buckets;
        //根据最大值的位数决定遍历的次数
        for (int i = 1; max / i > 0; i *= 10) {
            buckets = new int[arr.length][10];

            //获取每位数字分配到桶中
            for (int j = 0; j <arr.length ; j++) {
                int num = (arr[j] / i) % 10;
                buckets[j][num] = arr[j];
            }

            int k = 0;
            for (int j = 0; j < 10; j++) {
                //对桶中的元素进行回收
                for (int l = 0; l < arr.length; l++) {
                    if (buckets[l][j] != 0){
                        arr[k++] = buckets[l][j];
                    }
                }
            }
        }
    }

    /**
     * 递归,求出数组的最大值
     * @param arr   数组
     * @param l 数组的第一个数
     * @param r 数组的最后一个数
     * @return  数组中的最大值
     */
    private static int findMax(int[] arr, int l, int r) {
        //如果数组中只有一个数,直接返回
        if (l == r){
            return arr[l];
        }else{
            int a = arr[l];
            //递归找出整体的最大值
            int b = findMax(arr,l+1,r);

            if (a > b){
                return a;
            }else{
                return b;
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {100,526,231,5,516,328,418};
        radixSort(arr);
        for (int i = 0; i < arr.length ; i++) {
            System.out.print(arr[i] + "    ");
        }
    }

}

四、结论

  • 基数排序是稳定的排序算法
  • 基数排序时间复杂度近似于O(N)
  • 基数排序的数据需要可以切割出独立的位来比较
  • 每一位的数据不能太大,可以用线性排序算法来排序

文章为阿伦原创,如果文章有错的地方欢迎指正,大家互相交流。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值