美文网首页算法
八大排序算法之基数排序

八大排序算法之基数排序

作者: 一凡呀 | 来源:发表于2017-11-20 16:21 被阅读0次

    时间复杂度:O(N)
    额外空间复杂度:O(N)
    是否可实现稳定性:是

    思路:

    创建一个bucket[],长度0~9,余数桶,从个位开始,把数装桶取出,循环次过程,得出结果

    例子:

    {24,5,77,152,221,111}
    第一次: 1号桶:221 111 2号桶:152 4号桶:24 5号桶:5 七号桶:77
    第二次:0号桶:5 1号桶:111 2号桶:221,24 5号桶:152 7号桶:77
    第三次:0号桶:5 24 77 一号桶:111 152 2号桶221
    排序完成 {5,24,77,111,152,221}

    代码:

      public static void radixSort(int[] arr,int digit){
    
            if (arr==null||arr.length<2){
                return;
            }
            //用在桶每次倒出来的循环
            int k =0;
            //最大数的位数
            int m = 1;
            //取余数,比如第一次按个位数进桶就先除1,第二次十位数就先除10
            int n = 1;
            //二维数组,10代表余数0~9,第二维代表每个余数最多有多少个数
            int[][] temp = new int[10][arr.length];
            // order下标代表余数,值代表每个余数位置上,有几个数
            int[] order = new int[arr.length];
    
            while (m<=digit){
                for (int i =0;i<arr.length;i++){
                    //取余数
                    int rem = (arr[i]/n) % 10;
                    //从该余数的第0个开始装
                    temp[rem][order[rem]++]=arr[i];
                }
    
                for (int i = 0;i<arr.length;i++){
                    //i位置上有没有数
                    if (order[i]!=0){
                        for (int j = 0;j<order[i];j++){
                            arr[k++] = temp[i][j];
                        }
                    }
                    order[i] = 0;
                }
    
                k = 0;
                m++;
                n*= 10;
            }
        }
    

    相关文章

      网友评论

        本文标题:八大排序算法之基数排序

        本文链接:https://www.haomeiwen.com/subject/uyivvxtx.html