当前位置: 首页 > article >正文

Java排序算法之基数排序

基数排序(Radix Sort)是一种线性时间复杂度的排序算法,其时间复杂度为O(d(n+k)),其中d是数字的位数,k是进制数。基数排序是一种非比较排序算法,它按照数位的大小来进行排序。它可以处理正整数、负整数和小数。

基数排序的实现过程如下:

  1. 找到最大数,并确定最大数的位数。

  2. 从个位数开始,把所有数按照该位数进行排序。可以使用计数排序或桶排序。排序后,原数组变成了按照该位数排序后的数组。

  3. 重复第二步,直到最大数的最高位被处理完。

举个例子:

假设有以下六个数字要排序:23,46,12,67,34,89。我们先找到最大数89,确定最大数的位数为2。

第一轮排序按照个位数排序:

个位数桶1桶2桶3桶4桶5桶6桶7桶8桶9
32334466789
212
6

第二轮排序按照十位数排序:

十位数桶1桶2桶3桶4桶5桶6桶7桶8桶9
31223344667
889

最终排序结果为:12,23,34,46,67,89。

Java实现基数排序的核心思想是:将数字按照每个位数分别排序,从低位到高位依次进行排序,最后得到有序序列。

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

public class RadixSort {
    /**
     * 基数排序
     * @param arr 待排序数组
     */
    public static void radixSort(int[] arr) {
        if (arr == null || arr.length == 0) return;

        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) max = arr[i]; // 找到最大值
        }

        int radix = 10; // 进制数,这里是10进制
        int exp = 1; // 指数
        int[] aux = new int[arr.length]; // 临时数组

        while (max / exp > 0) { // 从个位开始,对每一位进行排序
            int[] buckets = new int[radix];

            // 统计每个桶中的记录数
            for (int i = 0; i < arr.length; i++) {
                int bucketIndex = (arr[i] / exp) % radix;
                buckets[bucketIndex]++;
            }

            // 将各个桶中的数字个数,转化成各个桶中最后一个数字的索引位置
            for (int i = 1; i < radix; i++) {
                buckets[i] += buckets[i - 1];
            }

            // 将原数组中的元素放入临时数组中,根据桶中位置排序
            for (int i = arr.length - 1; i >= 0; i--) {
                int bucketIndex = (arr[i] / exp) % radix;
                aux[--buckets[bucketIndex]] = arr[i];
            }

            // 将有序的数组写回原数组
            for (int i = 0; i < arr.length; i++) {
                arr[i] = aux[i];
            }

            exp *= radix;
        }
    }

    public static void main(String[] args) {
        int[] arr = { 170, 45, 75, 90, 802, 24, 2, 66 };
        radixSort(arr);
        System.out.println(Arrays.toString(arr)); // [2, 24, 45, 66, 75, 90, 170, 802]
    }
}


http://www.kler.cn/a/133913.html

相关文章:

  • 【自用】0-1背包问题与完全背包问题的Java实现
  • 山泽光纤HDMI线:铜线的隐藏力量
  • C++编程:利用环形缓冲区优化 TCP 发送流程,避免 Short Write 问题
  • java模拟键盘实现selenium上下左右键 table中的左右滚动条实现滚动
  • 如何用WordPress和Shopify提升SEO表现?
  • 使用pytest+openpyxl做接口自动化遇到的问题
  • Libvirt-Qemu-Kvm 操作手记
  • 麒麟信安助力长沙市就业与社保数据服务中心政务系统向自主创新演进
  • 股东入股可用的出资形式主要有哪些
  • 工程化实战 - 前端AST(进阶)
  • 10_6 input输入子系统,流程解析
  • FISCO BCOS 3.0【01】搭建第一个区块链网络
  • 前台页面从数据库中获取下拉框值
  • SpringBoot项目连接linux服务器数据库两种解决方法(linux直接开放端口访问本机通过SSH协议访问,以mysql为例)
  • golang学习笔记——接口interfaces
  • cad提示由于找不到mfc140u.dll,无法继续执行代码怎么修复
  • Visual Studio Code---介绍
  • Android Frgment中onActivityResult无效的问题
  • mysql练习1
  • 多媒体ffmpeg学习教程
  • SDUT OJ《算法分析与设计》贪心算法
  • 23.11.19日总结
  • 【嵌入式 – GD32开发实战指南(ARM版本)】第2部分 外设篇 - 第3章 温度传感器DS18B20
  • 笔记54:门控循环单元 GRU
  • 【Web】Ctfshow SSTI刷题记录1
  • OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域