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

Java代码实现基数排序算法(附带源码)

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

1. 基数排序 vs 计数排序 vs 桶排序

基数排序有两种方法:

这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:

  • 基数排序:根据键值的每位数字来分配桶;
  • 计数排序:每个桶只存储单一键值;
  • 桶排序:每个桶存储一定范围的数值;

2. LSD 基数排序动图演示


代码实现

Java

/*** 基数排序* 考虑负数的情况还可以参考: https://www.erdangjiade.com/js*/
public class RadixSort implements IArraySort {@Overridepublic int[] sort(int[] sourceArray) throws Exception {// 对 arr 进行拷贝,不改变参数内容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);int maxDigit = getMaxDigit(arr);return radixSort(arr, maxDigit);}/*** 获取最高位数*/private int getMaxDigit(int[] arr) {int maxValue = getMaxValue(arr);return getNumLenght(maxValue);}private int getMaxValue(int[] arr) {int maxValue = arr[0];for (int value : arr) {if (maxValue < value) {maxValue = value;}}return maxValue;}protected int getNumLenght(long num) {if (num == 0) {return 1;}int lenght = 0;for (long temp = num; temp != 0; temp /= 10) {lenght++;}return lenght;}private int[] radixSort(int[] arr, int maxDigit) {int mod = 10;int dev = 1;for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {// 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)int[][] counter = new int[mod * 2][0];for (int j = 0; j < arr.length; j++) {int bucket = ((arr[j] % mod) / dev) + mod;counter[bucket] = arrayAppend(counter[bucket], arr[j]);}int pos = 0;for (int[] bucket : counter) {for (int value : bucket) {arr[pos++] = value;}}}return arr;}/*** 自动扩容,并保存数据** @param arr* @param value*/private int[] arrayAppend(int[] arr, int value) {arr = Arrays.copyOf(arr, arr.length + 1);arr[arr.length - 1] = value;return arr;}
}

希望你也学会了,更多编程源码模板请来二当家的素材网:https://www.erdangjiade.com

http://www.lryc.cn/news/296368.html

相关文章:

  • 基于python+django,我开发了一款药店信息管理系统
  • VSCODE使用ssh远程连接时启动服务器失败问题
  • easyexcle 导出csv
  • Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(一)
  • ESP32QRCodeReader库使用,ESP32-CAM识别二维码并向自写接口发出请求确认身份。
  • 什么是网络渗透,应当如何防护?
  • 掌握C++中的动态数据:深入解析list的力量与灵活性
  • 天地伟业接入视频汇聚/云存储平台EasyCVR详细步骤
  • Vue源码系列讲解——虚拟DOM篇【二】(Vue中的DOM-Diff)
  • 基于AST实现一键自动提取替换国际化文案
  • 嵌入式硬件工程师与嵌入式软件工程师
  • 【华为云】云上两地三中心实践实操
  • Linux大集合
  • 深入解析 Spring 事务机制
  • 第9章 安全漏洞、威胁和对策(9.11-9.16)
  • Mysql-数据库压力测试
  • CI/CD总结
  • 【CSS】margin塌陷和margin合并及其解决方案
  • Python并发
  • 2024-02-04(hive)
  • P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数--2024冲刺蓝桥杯省一
  • The Back-And-Forth Method (BFM) for Wasserstein Gradient Flows windows安装
  • 【GAMES101】Lecture 19 透镜
  • 防范恶意勒索攻击!亚信安全发布《勒索家族和勒索事件监控报告》
  • AR人脸106240点位检测解决方案
  • 数字图像处理实验记录八(图像压缩实验)
  • navigator.mediaDevices.getUserMedia获取本地音频/麦克权限并提示用户
  • CTF-show WEB入门--web19
  • 04 使用gRPC实现客户端和服务端通信
  • 设计模式-行为型模式(下)