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

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]}
}

相关文章:

  • 物联网AI MicroPython学习之语法 network网络配置模块
  • 2010年数据结构408
  • Realistic fault detection of li-ion battery via dynamical deep learning
  • JimuReport积木报表 v1.6.5 版本发布—免费报表工具
  • AIOT数字孪生智慧工地一体化管理平台源码
  • Vue3 源码解读系列(五)——响应式
  • [Socket]Unix socket 运行权限问题
  • 关于跨域问题的个人理解
  • Vue 3.0 + vite + axios+PHP跨域问题的解决办法
  • 【数据结构】顺序表 | 详细讲解
  • 17. 机器学习——SVM
  • 专业的SRM系统全流程管理服务
  • iText v1.8.1(OCR截图文字识别工具)
  • centralwidget 不能布局
  • HarmonyOS 高级特性
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • avalon2.2的VM生成过程
  • AWS实战 - 利用IAM对S3做访问控制
  • co.js - 让异步代码同步化
  • EOS是什么
  • Fabric架构演变之路
  • Java-详解HashMap
  • k8s 面向应用开发者的基础命令
  • opencv python Meanshift 和 Camshift
  • WebSocket使用
  • Web标准制定过程
  • Windows Containers 大冒险: 容器网络
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 官方解决所有 npm 全局安装权限问题
  • 机器学习学习笔记一
  • 两列自适应布局方案整理
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 使用Gradle第一次构建Java程序
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 小而合理的前端理论:rscss和rsjs
  • 一个JAVA程序员成长之路分享
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 函数计算新功能-----支持C#函数
  • ​flutter 代码混淆
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #Z0458. 树的中心2
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转) 深度模型优化性能 调参
  • .java 9 找不到符号_java找不到符号
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET MVC第三章、三种传值方式