zoukankan      html  css  js  c++  java
  • 8. 基数排序

    思想

    基数排序,是按照元素的更小元素组成来进行排序。拿常用的数字排序举例,会先对个位进行排序,然后对十位进行排序。

    其中,关键是如何对个位进行排序,如何对十位进行排序。

    我们知道对于数字的每一位,只有10个数字(0-9),这就是基数。所以故名,基数排序。基数排序所以可以理解为适用于基数是有限的情况下。

    所以基数排序中的基数,相当于把计数排序中的计数数组的大小确定下来了。

    那么如何对个位、十位进行排序呢?可以用到计数排序。

    实现

    import java.util.Arrays;
    
    public class RadixSort {
        public static void main(String[] args) {
            int[] array = { 1200, 292, 121, 72, 233, 44, 12 };
            radixSort(array, 10, 4);
            System.out.println(Arrays.toString(array));
    
        }
    
        public static void radixSort(int[] array, int radix, int d){
            int[] tempArray = new int[array.length];
            int[] count = new int[radix];
    
            int rate = 1;
            for (int i = 0; i < d; i++) {
                Arrays.fill(count, 0);
                System.arraycopy(array, 0, tempArray, 0, array.length);
    
                for (int j = 0; j < array.length; j++) {
                    int subKey = (tempArray[j] / rate) % radix;
                    count[subKey]++;
                }
    
                for (int j = 1; j < radix; j++) {
                    count[j] = count[j] + count[j - 1];
                }
                
    
                for (int m = array.length - 1; m >= 0; m--) {
                    int subKey = (tempArray[m] / rate) % radix;
                    array[--count[subKey]] = tempArray[m]; 
                }
                rate *= radix;//前进一位
            }
        }
    }
    
    

    复杂度

    实现思路就是对每个位进行计数排序,所以时间复杂度为未排序数据中的最长位数乘以计数排序的时间复杂度。

    空间复杂度为基数大小。

    可以看到,基数排序解决了计数排序中的数据最大最小值间隔问题,允许数值相差较大的数字进行排序。

  • 相关阅读:
    go语言最新版本 下载地址
    PHP5 各版本维护时间
    springzuul本地路由和跨服务器路由问题
    大数据学习路线(转载)
    springcoud feign超时的问题
    java 桥接模式
    springcloud单个服务内存使用详情
    centos7搭建filebeat
    centos7搭建logstash
    centos7搭建kibana
  • 原文地址:https://www.cnblogs.com/zhouzhiyao/p/12531909.html
Copyright © 2011-2022 走看看