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日

相关文章

  • 学好Java MyBatis拦截器,提高工作效率

    学好Java MyBatis拦截器可以提高工作效率,以下是学习拦截器的完整攻略: 1. 拦截器功能及作用 在学习拦截器之前,我们需要了解拦截器的作用。拦截器提供了一种拦截和修改程序执行的方式,以便动态地添加、修改或删除程序的功能。它也可以用于收集日志,或者权限控制等。 MyBatis的拦截器可以作用于执行器、参数处理器、结果集处理器、SQL语句生成器的过程中…

    Java 2023年5月20日
    00
  • springboot升级过程中踩坑定位分析记录 | 京东云技术团队

    作者:京东零售 李文龙 1.背景 “ 俗话说:为了修复一个小bug而引入了一个更大bug ” 因所负责的系统使用的spring框架版本5.1.5.RELEASE在线上出过一个偶发的小事故,最后定位为spring-context中的一个bug导致的。 为了修复此bug进行了spring版本的升级,最终定的版本为收银台团队使用的版本5.2.12.RELEASE,…

    Java 2023年4月30日
    00
  • Spring Data JPA中的动态查询实例

    下面是关于 “Spring Data JPA中的动态查询实例” 的完整攻略。 什么是动态查询 Spring Data JPA 提供丰富的方法用于查询数据,但在实际场景中,由于数据查询条件多种多样,无法事先确定,因此需要在运行时根据不同的条件动态构造 SQL 语句。动态查询是指根据不同的条件构造 SQL 语句,从而满足不同的查询需求。 常见的动态查询包括按照某…

    Java 2023年5月20日
    00
  • jsp页面中插入css样式的三种方法总结

    下面将详细讲解jsp页面中插入css样式的三种方法总结。 方法一:直接在jsp页面中使用style标签 在jsp页面的标签中添加 标签,然后直接在其中编写CSS样式即可。 示例: <%@ page contentType="text/html;charset=UTF-8" language="java" %&gt…

    Java 2023年6月15日
    00
  • spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐

    Spring Boot 集成 Shiro 在 Spring Boot 中集成 Shiro 需要以下步骤: 引入依赖。在 pom.xml 中添加以下依赖: <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</a…

    Java 2023年5月20日
    00
  • java实现文件重命名的方法

    这里是“Java实现文件重命名的方法”的完整攻略,包含两条示例。 1. Java实现文件重命名的方法 Java提供了renameTo()方法来实现文件重命名。该方法位于Java File类中,其语法如下: public boolean renameTo(File dest) 其中dest为需要重命名后的文件路径。 该方法返回值为布尔型,如果重命名成功则返回t…

    Java 2023年5月19日
    00
  • Java后台返回和处理JSon数据的方法步骤

    Java后台返回和处理JSON数据的方法步骤可以分为以下几个步骤: 步骤一:导入JSON库 首先需要在Java项目中导入Json库,比较流行的有Gson和Jackson。这里以Gson为例: <!–导入Gson依赖–> <dependency> <groupId>com.google.code.gson</gro…

    Java 2023年5月26日
    00
  • Java 数据库连接池Druid 的介绍

    下面我将详细讲解“Java 数据库连接池Druid 的介绍”,分为以下几个方面: Druid 简介 Druid 优势 Druid 的使用 实例演示 1. Druid 简介 Druid 是阿里巴巴开源的一个高效的数据库连接池框架,其功能全面,性能优异,使用方便。Druid 官方提供了界面功能,可以监控数据库连接和 SQL 调用等信息。 Druid 提供以下功能…

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