美文网首页
基数排序

基数排序

作者: 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.桶排序复习

相关文章

  • 基数排序(c++) to be continued

    [TOC] 参考 基数排序算法的实现与优化 clickhouse 实现的基数排序源码 基数排序的性能优化 Radi...

  • 数组-基数排序

    采用基数排序方式对数组进行排序 基数排序百科:基数排序排序(Distribution Sort),属于分配式排序,...

  • day12-基数排序

    基数排序 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”...

  • swift经典算法-基数排序

    基数排序算法 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子...

  • php-计数排序、基数排序、桶排序

    计数排序、基数排序、桶排序 时间复杂度 O(n) 计数排序 基数排序 桶排序

  • 数据结构之基数排序

    1.基数排序(桶排序)介绍 基数排序(radix sort)属于“分配式排序”(distribution sort...

  • 基数排序(Radix Sort)

    基本思想: 基数排序是一种有意思的排序,在看过其它比较排序后,基数排序真的很有意思。 基数排序(Radix Sor...

  • 5分钟了解基数排序

    5分钟了解基数排序 前言 基数排序无需进行比较和交换,而是利用分配和收集两种基本操作实现排序。基数排序分为两种:第...

  • 算法面经--基数排序

    基数排序 一、算法思路 1.简单介绍 1)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法 基数排...

  • 基数排序

    基数排序已经不再是一种常规排序方法,它更多地像一种排序方法的应用,基数排序必须依赖于另外的排序方法。基数排序的总体...

网友评论

      本文标题:基数排序

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