排序算法第四谈:基数排序

一、思想

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

二、图解过程

排序算法第四谈:基数排序_第1张图片

排序算法第四谈:基数排序_第2张图片

排序算法第四谈:基数排序_第3张图片

三、核心代码

   /**
     * 基数排序
     * 构造一个桶,每个数按位数分别放入桶中,放完后,从桶中取出数据放入数组
     */
    public static void barrelSort(int[] arr) {
     
        int[][] barrel = new int[10][arr.length];//考虑最坏的情况
        //为了保证回收的时候知道每个桶中放了多少个数据
        int[] barreCount = new int[10];
        //按位数确定循环次数,所以需要提前知道最大数长度
        int leght = (getMax(arr) + "").length();
        for (int i = 0, m = 1; i < leght; i++, m *= 10) {
     
            //每次循环,按当前位的数子放入桶中
            for (int j = 0; j < arr.length; j++) {
     
                int temp = (arr[j] / m) % 10;//当前位数的数字
                barrel[temp][barreCount[temp]++] = arr[j];
            }
            //从桶中一次取出数据放回原数组
            int indexBarre = 0;//当前数组索引
            for (int j = 0; j < 10; j++) {
     
                if (barreCount[j] != 0) {
     
                    for (int n = 0; n < barreCount[j]; n++) {
     
                        arr[indexBarre++] = barrel[j][n];
                    }
                }
                barreCount[j] = 0;
            }
        }
    }
    public static int getMax(int[] arr) {
     
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) if (max < arr[i]) max = arr[i];
        return max;
    }

四、速度测试

排序算法第四谈:基数排序_第4张图片

你可能感兴趣的:(数据结构与算法,java,算法,排序算法,数据结构)