美文网首页
基数排序

基数排序

作者: ChengerChen | 来源:发表于2019-10-18 18:42 被阅读0次
    package com.sort;
    
    import java.util.Scanner;
    
    /**
     * 基数排序(桶排序的优化) O(n+d(n+10+n+n))        稳定算法
     * 桶排序缺点:当最大值最小值间隔特别大时,浪费时间、空间。
     * 时间复杂度O(n+(m+n))n为元素个数,m为桶大小)
     * 桶排序:例如:5、2、1000三个元素排序时,需要建大小为1000的桶。浪费空间、时间。
     * @author chenger
     *
     */
    public class RadixSort {
    
        public static void main(String[] args) {
            new RadixSort().calculate();
        }
        
        public void calculate() {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int[] arr = new int[n];
            int i = 0;
            while(n > i) {
                arr[i++] = scanner.nextInt();
            }
            sort(arr);
            scanner.close();
        }
        
        public void sort(int[] arr) {
            int[] buckets = new int[10];    //桶
            int[] temp = new int[arr.length]; //临时
            int max = arr[0];
            // 找出最大元素
            for(int i : arr) {
                if(i > max)
                    max = i;
            }
            // 循环len次
            for(int exp = 1 ; max / exp > 0 ; exp *= 10) {
                //计算每个桶有多少数据
                for(int i : arr) {
                    buckets[i / exp % 10]++;
                }
                /**
                 * 例如buckets[0]为0 buckets[1]为1、buckets[2]为2、buckets[3]为3 、
                 * buckets[4]为2时说明buckets[4]的两个元素在这一次排序中的7-8位置。
                 */
                // 统计buckets里的数
                for(int i = 1 ; i < 10 ; i++) {
                    buckets[i] += buckets[i-1]; // buckets[i]的值应该在数组的什么位置
                }
                
                //数据按序存入临时空间
                for(int i = arr.length - 1 ; i >= 0 ; i--) {
                    // **判断当前数据在哪个桶里,并且那个桶的数据在这次排序应该排在什么位置**
                    temp[buckets[arr[i] / exp % 10]-- - 1] = arr[i];
                }
                System.arraycopy(temp, 0, arr, 0, arr.length);  //一次排序结果
                for(int i = 0 ; i < 10 ; i++) {
                    buckets[i] = 0;
                }
            }
            for(int i : arr) {
                System.out.print(i + " ");
            }
        }
    
    }
    

    描述

    1.桶排序复习

    相关文章

      网友评论

          本文标题:基数排序

          本文链接:https://www.haomeiwen.com/subject/oqdwmctx.html