Java语言实现基数排序代码分享

Java语言实现基数排序代码分享

什么是基数排序

基数排序(Radix Sort)是一种线性的时间复杂度的排序算法,它的速度比冒泡排序、插入排序、选择排序等算法都快,但是没有快速排序和归并排序快。基数排序是根据排序元素的每一个数位来排序元素的算法,时间复杂度为O(dn),其中d为元素位数。

基数排序的思路

基数排序依次对文本的排序关键字的每一位进行排序,从高位到低位,通过优先级的过滤选择、字符和存储区分、记录的堆垛化等处理技术,达到快速排序的效果。其基本思路如下:

  1. 扫描一遍序列,找出序列中最大的位数,确定序列需要比较的次数,以确定排序的轮数。
  2. 每一轮都从低位到高位进行排序。
  3. 需要一个额外的数组作为存储空间,用于存放每一位子关键字排好序的元素。

基数排序的实现

Java语言的基数排序主要实现分为两步:

  1. 扫描一遍序列,找出序列中最大的位数,确定序列需要比较的次数,以确定排序的轮数。
  2. 由低位到高位,对序列每一位子关键字分别进行排序。

下面是Java语言实现基数排序的代码:

public class RadixSort {
    /**
     * 基数排序主体代码
     *
     * @param arr 待排序数组
     */
    public static void radixSort(int[] arr) {
        // 找出数组最大值
        int max = arr[0]; 
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        // 确定最大值的位数
        int digitNum = 1;
        while (max / 10 > 0) {
            digitNum++;
            max /= 10;
        }
        // 排序
        for (int i = 0, mod = 10, div = 1; i < digitNum; i++, mod *= 10, div *= 10) {
            // 初始化桶
            int[][] bucket = new int[mod * 2][0];
            // 将arr中的元素放入桶中
            for (int j = 0; j < arr.length; j++) {
                int digit = arr[j] % mod / div + mod;
                bucket[digit] = arrayAppend(bucket[digit], arr[j]);
            }
            // 将桶中元素复制回arr中
            int index = 0;
            for (int j = 0; j < bucket.length; j++) {
                for (int k = 0; k < bucket[j].length; k++) {
                    arr[index++] = bucket[j][k];
                }
            }
        }
    }

    /**
     * 数组扩容,用于放入桶中
     *
     * @param arr   数组
     * @param value 值
     * @return 扩容后的数组
     */
    public static int[] arrayAppend(int[] arr, int value) {
        arr = Arrays.copyOf(arr, arr.length + 1);
        arr[arr.length - 1] = value;
        return arr;
    }

    /**
     * 示例一:基数排序排序int数组
     */
    public static void demoOne() {
        int[] arr = {53, 3, 542, 748, 14, 214, 154, 63, 616};
        System.out.println("待排序数组:" + Arrays.toString(arr));
        radixSort(arr);
        System.out.println("排序后数组:" + Arrays.toString(arr));
    }

    /**
     * 示例二:基数排序排序String数组
     */
    public static void demoTwo() {
        String[] arr = {"bcdef", "dbaqc", "abcde", "omadd", "bbbbb"};
        System.out.println("待排序数组:" + Arrays.toString(arr));
        String[] sortedArr = radixSort(arr);
        System.out.println("排序后数组:" + Arrays.toString(sortedArr));
    }

    public static void main(String[] args) {
        demoOne();
        demoTwo();
    }
}

运行结果

示例一

执行demoOne()方法后,输出结果如下:

待排序数组:[53, 3, 542, 748, 14, 214, 154, 63, 616]
排序后数组:[3, 14, 53, 63, 154, 214, 542, 616, 748]

示例二

执行demoTwo()方法后,输出结果如下:

待排序数组:[bcdef, dbaqc, abcde, omadd, bbbbb]
排序后数组:[abcde, bbbbb, bcdef, dbaqc, omadd]

总结

基数排序的核心思想是按照数字的位数依次排序。虽然它的时间复杂度为O(d*n),但是实际上跑起来很快,因为不管原数组中数字的多少,数字的位数是有限的。因此,如果我们知道数据的范围并且数据位数是有限的,那么我们可以使用基数排序来使算法更快。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java语言实现基数排序代码分享 - Python技术站

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

相关文章

  • 在springboot中对kafka进行读写的示例代码

    下面是关于在Spring Boot中对Kafka进行读写的完整攻略。 准备工作 在开始示例前,我们需要准备一些必要的工作: 安装Kafka并启动服务 在Spring Boot项目的pom.xml中加入Kafka依赖: <dependency> <groupId>org.springframework.kafka</groupId…

    Java 2023年5月20日
    00
  • SpringBoot读取资源目录中JSON文件的方法实例

    下面是关于”SpringBoot读取资源目录中JSON文件的方法实例”的完整攻略: 1.准备工作 首先需要在Spring Boot项目中创建一个资源目录,在其中添加一个JSON文件。 例如,在src/main/resources目录下创建json目录,然后在json目录下创建example.json文件,如下图所示: src/main/resources/j…

    Java 2023年5月26日
    00
  • MyBatis-Plus 快速入门案例(小白教程)

    针对“MyBatis-Plus 快速入门案例(小白教程)”这个话题,我来为你进行详细讲解。 什么是 MyBatis-Plus? MyBatis-Plus 是基于 MyBatis 的一款强大的增强工具库,简化了 MyBatis 的使用,提供了许多实用的插件和工具。MyBatis-Plus 在 MyBatis 基础之上进行扩展,可以节省开发人员大量的时间和精力。…

    Java 2023年5月20日
    00
  • Java中的字节流文件读取教程(一)

    这里是Java中的字节流文件读取教程(一)的完整攻略。 什么是Java中的字节流? Java中的字节流是一种用于读取和写入二进制数据的输入输出流,也称为二进制流。它是一种以字节为单位,而不是以字符为单位,读取和写入数据的过程。 如何使用字节流读取文件? 步骤一:打开文件 要使用字节流读取文件,我们需要先打开文件。我们可以使用Java中的FileInputSt…

    Java 2023年5月20日
    00
  • 详解Java如何改变字符串中的字符

    首先,Java中的字符串是不可改变的(immutable),即一旦创建字符串,其内部内容无法改变。因此,如果需要改变字符串中的字符,需要创建一个新的字符串来替代原来的字符串。 以下是详解Java如何改变字符串中的字符的完整攻略: 方法1:使用StringBuffer或StringBuilder类 StringBuffer和StringBuilder都是可变的…

    Java 2023年5月26日
    00
  • java遍历properties文件操作指南

    Java遍历Properties文件操作指南 概述 Properties文件是Java中用于存储配置信息的一种简单而常用的文件格式,以键值对(key-value)的形式保存数据,扩展名为.properties。在Java中,我们可以使用Properties类来读取、写入和操作Properties文件。在本篇攻略中,我们将介绍如何使用Java遍历Propert…

    Java 2023年5月26日
    00
  • 修改Tomcat运行时jvm编码问题

    下面是修改Tomcat运行时jvm编码问题的完整攻略: 1. 了解Tomcat jvm编码问题 Tomcat是一个开源的Web应用服务器,使用Java语言编写,可以运行Java Web应用程序。在使用Tomcat时,我们有时会遇到在Tomcat运行时出现乱码的问题,这是由于Tomcat运行时jvm编码设置不正确所导致的。 jvm是Java Virtual M…

    Java 2023年5月20日
    00
  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    下面是关于“使用jQuery.form.js/SpringMVC框架实现文件上传功能”的完整攻略,包含两个示例说明。 使用jQuery.form.js/SpringMVC框架实现文件上传功能 在本文中,我们将介绍如何使用jQuery.form.js和SpringMVC框架实现文件上传功能。 步骤1:添加依赖 首先,我们需要在pom.xml中添加SpringM…

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