• 基数排序——Java实现


    一、基数排序思想

           相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作。基数 排序是一种按记录关键字的各位值逐步进行排序的方法。此种排序一般适用于记录的关键字为整数类型的情况。所有对于字符串和文字排序不适合。

          实现:将所有待比较数值(自然数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

          基数排序的两种方式:

    1. 高位优先,又称为最有效键(MSD),它的比较方向是由右至左;
    2. 低位优先,又称为最无效键(LSD),它的比较方向是由左至右;

    二、图解

    基数排序实例1

    堆排序动画演示

    三、代码实现

    /**
     * 基数排序演示
     *
     * @author Lvan
     */
    public class RadixSort {
        public static void main(String[] args) {
            int[] arr = {63, 157, 189, 51, 101, 47, 141, 121, 157, 156,
                    194, 117, 98, 139, 67, 133, 181, 12, 28, 0, 109};
    
            radixSort(arr);
    
            System.out.println(Arrays.toString(arr));
        }
    
        /**
         * 高位优先法
         *
         * @param arr 待排序列,必须为自然数
         */
        private static void radixSort(int[] arr) {
            //待排序列最大值
            int max = arr[0];
            int exp;//指数
    
            //计算最大值
            for (int anArr : arr) {
                if (anArr > max) {
                    max = anArr;
                }
            }
    
            //从个位开始,对数组进行排序
            for (exp = 1; max / exp > 0; exp *= 10) {
                //存储待排元素的临时数组
                int[] temp = new int[arr.length];
                //分桶个数
                int[] buckets = new int[10];
    
                //将数据出现的次数存储在buckets中
                for (int value : arr) {
                    //(value / exp) % 10 :value的最底位(个位)
                    buckets[(value / exp) % 10]++;
                }
    
                //更改buckets[i],
                for (int i = 1; i < 10; i++) {
                    buckets[i] += buckets[i - 1];
                }
    
                //将数据存储到临时数组temp中
                for (int i = arr.length - 1; i >= 0; i--) {
                    temp[buckets[(arr[i] / exp) % 10] - 1] = arr[i];
                    buckets[(arr[i] / exp) % 10]--;
                }
    
                //将有序元素temp赋给arr
                System.arraycopy(temp, 0, arr, 0, arr.length);
            }
    
        }
    }
  • 相关阅读:
    DMALL刘江峰:生鲜市场具有巨大O2O改造空间
    互联网产品经理能力体系
    Review Board——在线代码审查工具
    Java Dns Cache Manipulator
    Keepalived 双机web服务宕机检测切换系统软件
    weblogic性能调优参考
    spring的ResultSetWrappingSqlRowSet使用rs.getTimestamp取oracle数据库时分秒问题
    oracle ORA-01747(系统保留关键字)user.table.column, table.column 或列说明无效 hibernate映射oracle保留关键字
    javascript模块化编程(AMD规范的加载器)
    oracle定时运行 存储过程
  • 原文地址:https://www.cnblogs.com/brady-wang/p/15160055.html
Copyright © 2020-2023  润新知