欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

桶排序(基数排序)

程序员文章站 2022-03-24 15:29:18
...

出现频率最多的 k 个数

设置若干个桶,每个桶存储出现频率相同的数,并且桶的下标代表桶中数出现的频率,即第 i 个桶中存储的数出现的频率为 i。把数都放到桶之后,从后向前遍历桶,最先得到的 k 个数就是出现频率最多的的 k 个数。

基数排序(也叫桶排序)

第一趟桶排序将数字的个位数分配到桶子里面去,然后回收起来,此时数组元素的所有个位数都已经排好顺序了
第二趟桶排序将数字的十位数分别分配到桶子里面去,然后回收起来,此时数组元素的所有个位数和十位数都已经排好顺序了(如果没有十位数、则补0)
第三趟桶排序将数字的百位数分别分配到桶子里面去,然后回收起来,此时数组元素的所有个位数和十位数和百位数都已经排好顺序了(如果没有百位数、则补0)
注意:桶的回收是按列来进行的。这个很重要。

public int[] radixSort(int[] a){
        int max=findMax(a,0,a.length-1);
        for(int i=1;max/i>0;i=i*10){//遍历的次数
            int bucket[][]=new int[a.length][10];
            for(int j=0;j<a.length;j++){
                int col=(a[j]/i)%10;
                bucket[j][col]=a[j];
            }
            int k=0;
            
            for(int m=0;m<10;m++){
                for(int n=0;n<a.length;n++){
                    if(bucket[n][m]!=0){
                        a[k++]=bucket[n][m];
                    }
                }
            }
            
        }
        return a;
    }
    /**
     * @param a
     * @param left
     * @param right
     * @return
     *<p>Description: 递归找数组的最大元素</p>  
     */
    private int findMax(int[] a, int left, int right) {

        if(left==right){
            return a[left];
        }
        int m=a[left];
        int n=findMax(a, left+1, right);
        if(m>n){
            return m;
        }
        else{
            return n;
        }
        
    }