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实现简单计算器小程序

    Java实现简单计算器小程序攻略 1. 准备工作 在开始编写代码前,需要先安装Java开发环境(JDK)和集成开发工具(IDE)。 可以通过以下步骤安装JDK和IDE: 下载并安装JDK。可以从官网下载JDK的安装包,下载完后按照提示进行安装,并配置环境变量。 JDK官网:https://www.oracle.com/java/technologies/ja…

    Java 2023年5月23日
    00
  • 如何使用Java缓存框架?

    使用Java缓存框架可以有效地提高系统的性能和响应速度。下面将对如何使用Java缓存框架进行详细讲解。 什么是Java缓存框架 Java缓存框架是一个用于在内存中缓存数据的工具。它可以有效地提高系统的性能和响应速度。Java缓存框架最常用的实现方式是基于内存的缓存,使用Java缓存框架可以将数据在内存中保存一段时间,从而减少系统对数据库的访问。 常见的Jav…

    Java 2023年5月11日
    00
  • Java实现四则混合运算代码示例

    下面详细讲解一下”Java实现四则混合运算代码示例”的攻略。 一、分析需求 在实现四则混合运算之前,我们需要先分析需求,根据问题的实际情况,确定实现的功能和需求。 四则混合运算包括”加、减、乘、除”四种基本运算,以及括号嵌套。我们需要考虑以下几个方面的需求: 支持四则运算以及括号嵌套。 具有运算符优先级和算数优先级, 先乘除后加减。 括号中的表达式优先级最高…

    Java 2023年5月19日
    00
  • asp的程序能实现伪静态化的方法

    ASP是一种动态网页开发技术,通常需要通过服务器端动态生成HTML代码。对于某些站点,如果开启了伪静态,可以有效地提升网站的SEO表现,提高流量。本文将详细讲解ASP程序如何实现伪静态化,包含以下内容: 了解伪静态化的原理 伪静态化是指将动态生成的页面URL转化为静态的HTML文档。例如将”index.asp?id=1″转化为”index_1.html”。当…

    Java 2023年6月15日
    00
  • java贪吃蛇游戏编写代码

    让我们来详细讲解一下“Java贪吃蛇游戏编写代码”的完整攻略。下面按照步骤逐一说明: 开发环境 首先要确保有Java的开发环境,最好使用较新版的Java进行开发。另外,需要使用到Java的图形界面库awt和swing。可以使用Java自带的集成开发环境Eclipse或者IntellJ IDEA等。 项目结构 在Eclipse中可以创建一个新的Java项目,在…

    Java 2023年5月30日
    00
  • MAVEN的安装配置与IDEA整合超详细教程

    下面我来详细讲解“MAVEN的安装配置与IDEA整合超详细教程”。 安装MAVEN 1. 下载MAVEN 首先,我们需要从官方网站下载MAVEN。目前最新版本是3.8.1,可以在Maven官网找到对应的下载链接。选择合适自己的版本并下载。 2. 安装MAVEN 下载完成之后,我们需要将MAVEN解压到某个目录下(比如D盘的maven目录下),然后将MAVEN…

    Java 2023年5月20日
    00
  • 解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题

    解决Spring JPA使用@Transactional注解时产生CGLIB代理冲突问题的完整攻略如下: 1. 问题原因 在基于Spring框架进行开发中,我们常常会使用事务管理器来进行业务逻辑的事务性管理,其中,开启事务的方式之一就是使用@Transactional注解。在使用@Transactional注解时,可能会出现CGLIB代理冲突的问题。这是因为…

    Java 2023年5月20日
    00
  • Springboot使用redis实现接口Api限流的实例

    Spring Boot使用Redis实现接口API限流的实例 在本文中,我们将详细讲解如何使用Spring Boot和Redis来实现接口API限流。我们将介绍两种不同的方法来实现这个目标,并提供示例来说明如何使用这些方法。 方法一:使用Redis实现限流 Redis是一个高性能的键值存储系统,它可以用于实现限流。我们可以使用Redis来记录每个IP地址的请…

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