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

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

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

基数排序有两种方法:

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

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

2. LSD 基数排序动图演示


代码实现

Java

java 复制代码
/**
 * 基数排序
 * 考虑负数的情况还可以参考: https://www.erdangjiade.com/js
 */
public class RadixSort implements IArraySort {

    @Override
    public 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

相关推荐
sszdlbw1 分钟前
后端springboot框架入门学习--第一篇
java·spring boot·学习
消失的旧时光-19434 分钟前
用 C 实现一个简化版 MessageQueue
c语言·开发语言
小鹿学程序4 分钟前
jdk配置完之后java -version还是默认的jdk版本如何更改
java·开发语言·python
至善迎风5 分钟前
Bun:下一代 JavaScript 运行时与工具链
开发语言·javascript·ecmascript·bun
她说彩礼65万7 分钟前
C# 反射
java·算法·c#
程序员-King.8 分钟前
【Qt开源项目】— ModbusScope-day 5
开发语言·qt
老秦包你会14 分钟前
QT第五课------QT系统相关------线程
开发语言·qt
hhy_smile15 分钟前
Android 与 java 设计笔记
android·java·笔记
lkbhua莱克瓦2419 分钟前
IO练习——网络爬虫(爬取数据)
java·开发语言·爬虫·io流练习·java练习
喇一渡渡20 分钟前
Java力扣---滑动窗口(1)
java·算法·排序算法