JAVA十大排序算法之基数排序详解

JAVA十大排序算法之基数排序详解

基本概念

基数排序是按照低位先排序,也就是先排个位,再排十位,以此类推。这样从最低位开始排序,直到最高位排序完成之后,数列就变成了一个有序序列。

算法步骤

基数排序的过程可以描述如下:

  1. 取得数组中的最大数,并取得位数;
  2. arr为原始数组,从最低位开始取每个位组成radix数组;
  3. 对radix进行计数排序(利用计数排序适用于小范围数的特点);
  4. 将排序好的radix数组重新构建为原数组arr;

代码实现

public static void radixSort(int[] arr) {
    if(arr == null || arr.length < 2) {
        return;
    }
    //取得数组中的最大数
    int max = Integer.MIN_VALUE;
    for(int i = 0; i < arr.length; i++) {
        max = Math.max(max, arr[i]);
    }
    //取得最大数的位数
    int digit = 1;
    while(max / 10 > 0) {
        digit++;
        max /= 10;
    }
    //初始化桶
    int[][] bucket = new int[10][arr.length];
    //存储每个桶中存放了几个数据
    int[] count = new int[10];
    //从低位到高位依次处理
    for(int i = 0; i < digit; i++) {
        //放入桶中
        for(int j = 0; j < arr.length; j++) {
            int num = arr[j] / (int)Math.pow(10, i) % 10;
            bucket[num][count[num]] = arr[j];
            count[num]++;
        }
        //取出桶中的数据
        int index = 0;
        for(int j = 0; j < 10; j++) {
            if(count[j] != 0) {
                for(int k = 0; k < count[j]; k++) {
                    arr[index++] = bucket[j][k];
                }
            }
            //桶清零
            count[j] = 0;
        }
    }
}

算法分析

时间复杂度:O(d * n),其中 d 为位数,n 为数字个数。由于基数排序需要借助一些存储空间来进行排序,因此空间复杂度较高,为 O(n + d)。

示例说明

示例1

输入:[3, 5, 1, 4, 2, 6, 7, 9, 8]

输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]

说明:计算出最大数为9,然后进行两轮排序,第一轮按照个位进行排序,第二轮按照十位进行排序,最终得到有序数组。

示例2

输入:[1234, 56, 89, 123, 123456]

输出:[56, 89, 123, 1234, 123456]

说明:对于位数不同的数,需要进行补全操作,如56补全为00056,然后再正式进行排序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA十大排序算法之基数排序详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • springboot通过jar包启动中文日志乱码问题及解决

    针对“springboot通过jar包启动中文日志乱码问题及解决”这个主题,我将给出完整的攻略,如下: 1. 问题描述 当使用Spring Boot通过jar包启动项目时,可能会遇到中文日志输出乱码的问题。 2. 问题解决 要解决这个问题,需要在应用程序的配置中设置日志输出编码。具体步骤如下: 2.1 设置日志输出编码 在Spring Boot应用程序的配置…

    Java 2023年5月20日
    00
  • Spring Security实现自定义访问策略

    Spring Security是一个开源的安全框架,提供了许多安全方案,其中自定义访问策略是Spring Security的核心之一。下面将详细讲解在Spring Security中实现自定义访问策略的完整攻略,包括以下内容: Spring Security的基本概念 自定义访问策略的原理 实现自定义访问策略的步骤 示例说明 1. Spring Securi…

    Java 2023年6月3日
    00
  • java语言图形用户登录界面代码

    Java语言构建图形用户登录界面是一项基本技能,以下是构建Java语言图形用户登录界面的完整攻略。 创建登录页面 要创建一个登录页面,需要使用Java Swing或JavaFX等GUI工具包来构建,这里以Java Swing为例。在Java Swing中,可以使用以下代码来创建一个基本的登录页面: import javax.swing.*; import j…

    Java 2023年5月24日
    00
  • Java自动生成编号的方法步骤

    当我们在开发Java应用程序时,有时候需要生成一个自增的编号或者序列号,本文将介绍一种生成Java自增序列号的方法。 步骤一:创建序列号的表 我们需要创建一个用于存储自增序列号信息的数据表,包括两个字段,一个是主键字段用于唯一标识该序列,另一个是序列号字段用于表示下一个序列号。 以下是一个示例SQL语句,用于创建一个序列号的MySQL数据表: CREATE …

    Java 2023年5月20日
    00
  • 深入浅出重构Mybatis与Spring集成的SqlSessionFactoryBean(上)

    让我来为你介绍一下“深入浅出重构Mybatis与Spring集成的SqlSessionFactoryBean(上)”的完整攻略。 首先,这篇文章主要介绍如何深入学习和理解MyBatis与Spring集成的SqlSessionFactoryBean,并重构该类以更好地适应不同的应用场景。下面我会根据文章的结构和内容,逐一为你进行讲解和说明。 第一部分:介绍Sq…

    Java 2023年5月19日
    00
  • 使用log4j输出一个类的所有参数的值

    使用log4j输出一个类的所有参数的值,需要经过以下步骤: 步骤一:添加log4j2依赖库 首先需要在项目中添加log4j2的依赖库,具体方式可以根据使用的构建工具不同而有所差异。以Maven为例,在pom.xml文件中添加如下依赖: <dependency> <groupId>org.apache.logging.log4j<…

    Java 2023年5月26日
    00
  • 基于springboot实现数据可视化的示例代码

    下面是基于Spring Boot实现数据可视化的完整攻略。 一、准备工作 首先确保你已经安装了Java JDK和Spring Boot,可以通过官网下载并安装。 接着,需要选择一个可视化工具,推荐使用Echarts图表库,因为Echarts是目前最流行的数据可视化工具之一,且可以很方便的与Spring Boot集成。 最后,我们需要一些待可视化的数据,以便进…

    Java 2023年5月20日
    00
  • 详解Java函数式编程和lambda表达式

    详解Java函数式编程和lambda表达式 什么是函数式编程 函数式编程是一种编程范式,它主要关注于描述问题是什么,而不是如何解决问题。在函数式编程中,函数是一等公民,可以像其他对象一样传递和操作。函数式编程强调表达式求值,而不是计算机执行指令。 为什么使用函数式编程 函数式编程能够简化代码逻辑,减少依赖关系,增加可重用性。使用函数式编程可以更好地利用多核处…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部