zoukankan      html  css  js  c++  java
  • 基数排序——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);
            }
    
        }
    }
  • 相关阅读:
    [LeetCode] Course Schedule
    [Algorithms] Topological Sort
    [Algorithms] Graph Traversal (BFS and DFS)
    [LeetCode] One Edit Distance
    [LeetCode] Summary Ranges
    [LeetCode] Missing Ranges
    [LeetCode] Fraction to Recurring Decimal
    17.Docker之使用dockerfile创建jdk镜像
    16.Docker之使用dockerfile创建nginx镜像
    7.Docker之dockerfile指令简介
  • 原文地址:https://www.cnblogs.com/brady-wang/p/15160055.html
Copyright © 2011-2022 走看看