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各种排序算法汇总 本文将详细讲解Java中常见的各种排序算法,包括冒泡排序、选择排序、归并排序、希尔排序、堆排序等,以及他们的实现代码和时间复杂度分析。 冒泡排序 冒泡排序是一种基础的排序算法,核心思想是将相邻的元素两两比较,将较大的元素向后移动。代码如下: public static void bubbleSort(int[] array) { f…

    Java 2023年5月19日
    00
  • springboot用户数据修改的详细实现

    SpringBoot用户数据修改的详细实现 在SpringBoot中,我们可以使用Spring Data JPA来实现用户数据的修改。以下是一个详细的实现攻略: 1. 添加依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId&g…

    Java 2023年5月15日
    00
  • 使用java写的矩阵乘法实例(Strassen算法)

    使用Java编写矩阵乘法实例 算法介绍 Strassen算法是一种快速的矩阵乘法算法,该算法的时间复杂度为O(n^log7)。相比于传统的矩阵乘法算法,在矩阵规模非常大时,Strassen算法可以显著减少计算量,提高计算效率。因此,它经常被应用于科学计算、数据分析等领域。 Strassen算法核心思想 Strassen算法的核心思想是:将一个nn的矩阵A分解…

    Java 2023年5月19日
    00
  • Java获取文件的路径及常见问题解决方案

    关于Java获取文件的路径及常见问题解决方案,下面是详细的攻略。 1. Java获取文件的路径 在Java中获取文件的路径是非常常见的需求,可以使用以下几种方式来获取: 1.1 获取当前运行的Java程序所在路径 String path = System.getProperty("user.dir"); 使用System.getPrope…

    Java 2023年5月20日
    00
  • Struts 2中实现Ajax的三种方式

    Struts 2 是一个基于MVC设计模式的Web框架,既支持传统的同步请求,也可以通过 Ajax 技术实现异步请求。在 Struts 2 框架中,实现 Ajax 的方式有以下三种: 1. 使用Struts2提供的<s:url>标签 Struts 2 提供了 <s:url> 标签,该标签可以在页面中生成一个 URL 地址,当用户点击或…

    Java 2023年5月20日
    00
  • 两种java文件上传实例讲解

    下面是详细讲解“两种java文件上传实例讲解”的攻略: 一、基于Spring MVC框架的文件上传实例 1. 在Maven项目配置中添加以下依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</…

    Java 2023年5月19日
    00
  • Nacos源码之注册中心的实现详解

    Nacos源码之注册中心的实现详解 Nacos 是一个开源的分布式系统服务发现、配置管理和服务管理平台,具有高度可扩展性和强一致性。 在 Nacos 中,注册中心是其核心组件之一,本文将详细讲解 Nacos 的注册中心实现原理及其源码解析。 注册中心的作用 在分布式系统中,服务提供者需要将自己的服务注册到注册中心,以便服务消费者可以通过注册中心获取服务提供者…

    Java 2023年6月15日
    00
  • Java并行处理的实现

    Java并行处理的实现攻略 在Java中实现并行处理可以提高代码的性能,让代码的运行更快。本文将介绍Java中并行处理的实现攻略。 并行处理的概念和原理 并行处理是指多个任务同时执行,相互之间不受影响,可以提高代码的运行效率。Java中可以使用多线程实现并行处理。多线程是指同时运行多个线程,每个线程都独立运行,并且可以访问共享变量。Java中的线程是通过ja…

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