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日

相关文章

  • Java Mybatis数据源之工厂模式

    Java Mybatis数据源之工厂模式 概述 在Java Mybatis中使用工厂模式可以有效地避免配置数据源时的硬编码及大量的重复代码,提高了代码的可维护性和可读性。 工厂模式的实现 工厂模式中通常有三个抽象角色,分别是工厂接口、具体工厂和产品接口。 在Java Mybatis中,可以将DataSource抽象为产品接口,将DataSourceProvi…

    Java 2023年5月20日
    00
  • java maven进阶教学

    Java Maven进阶教学攻略 Maven 是 Java 中最流行的构建工具之一,它可以自动化地管理和构建项目的依赖关系,允许开发人员专注于业务代码的开发。 安装 Maven Maven 的安装十分简单,只要在官网下载对应操作系统的二进制包,解压即可。详细步骤参考 Maven 安装指南: # 下载 Maven $ wget https://www-us.a…

    Java 2023年5月20日
    00
  • 4种java复制文件的方式

    当需要对文件进行复制操作时,可以采用Java的文件IO流来实现。下面介绍4种Java复制文件的方式。 1.使用FileChannel实现文件复制 通过FileChannel实现文件复制的方式,可以使用FileInputStream、FileOutputStream或RandomAccessFile打开文件通道,使用transferFrom或transferT…

    Java 2023年5月20日
    00
  • 详解Java中native方法的使用

    详解Java中native方法的使用 什么是native方法 在Java中,native方法是指使用C、C++等非Java语言实现的方法,通常用于Java程序中需要与底层操作系统或硬件等交互的场景,比如操作系统中调用一些API,访问硬件等。 使用native方法 在Java中使用native方法需要以下步骤: 声明native方法,以告诉编译器该方法的实现不…

    Java 2023年5月26日
    00
  • java通过MySQL驱动拦截器实现执行sql耗时计算

    首先让我解释一下MySQL驱动拦截器。MySQL驱动拦截器是通过JDBC驱动程序提供的一种扩展机制,以拦截JDBC API调用,从而可以在执行JDBC操作之前和之后添加自定义逻辑。使用MySQL驱动拦截器,我们可以实现一些非常有用的功能,例如,计算SQL执行时间、SQL量级统计、检测SQL注入等。 接下来,我将详细描述如何使用Java和MySQL驱动拦截器来…

    Java 2023年5月20日
    00
  • Java8实现FTP及SFTP文件上传下载

    下面是关于“Java8实现FTP及SFTP文件上传下载”的完整攻略。 一、FTP文件上传下载 1.1 准备工作 在开始前,需要引入以下的Maven依赖: <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifac…

    Java 2023年5月19日
    00
  • Java实现多个文档合并输出到一个文档

    下面是Java实现多个文档合并输出到一个文档的攻略,包含以下几个步骤: 步骤一:准备工作 创建一个Java项目,使用Maven或Gradle构建工具管理项目依赖。 导入需要用到的相关Java类库,如Apache POI等。 步骤二:读取多个文档 使用Java中的File类打开多个需要合并的文档,将每个文档的内容读取到内存中。 使用Apache POI类库对读…

    Java 2023年5月26日
    00
  • RSA加密算法java简单实现方法(必看)

    当然,下面我将为您详细讲解“RSA加密算法java简单实现方法(必看)”的完整攻略。 RSA加密算法java简单实现方法(必看) 简介 RSA加密算法是一种非对称加密算法,广泛运用于网络通信与安全领域。RSA算法通常需要进行非常复杂的数学运算,但我们完全可以利用Java的BigInteger类来实现RSA算法。 实现步骤 生成公私钥对 首先,我们需要通过Ja…

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