排序算法之六:基数排序

算法分析:(radixsort)则是属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排。

基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。它是这样实现的: 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零. 然后, 从最低位开始, 依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列.
基数排序的方式可以采用LSD(Least significantdigital)或MSD(Most significantdigital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。

 复杂度:

时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。

public void radixsort(int[] arr){
        //存储数组中的最大值
        int max=Integer.MIN_VALUE;
        for(int i=0;i<arr.length;i++){
            if(arr[i]>max){
                max=arr[i];
            }
        }
        //计算最大数字是几位数
        int maxLength=(max+"").length();
        int[][] temp=new int[10][arr.length];
        //用于记录在temp中相应的数组中存放数字的数量
        int[]counts=new int[10];
        //根据最大长度的数字决定比较的次数
        for(int i=0,n=1;i<maxLength;i++,n*=10){
            //把每个数分别取余
            for(int j=0;j<arr.length;j++){
                //计算余数
                int ys=arr[j]/n%10;
                //把数据放入指定的数组中
                temp[ys][counts[ys]]=arr[j];
                //记录数量
                counts[ys]++;
            }
            int index=0;
            //把数字取出来
            for(int k=0;k<counts.length;k++){
                if(counts[k]!=0){
                    //放回原数组
                    for(int l=0;l<counts[k];l++){
                        arr[index]=temp[k][l];
                        index++;
                    }
                    //把数量为0;
                    counts[k]=0;
                }
            }
        }
       }

猜你喜欢

转载自blog.csdn.net/qq_34015596/article/details/84924901