十大排序算法之——基数排序算法(Java实现)及思路讲解

基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表示字符串(如名字或日期)和特定格式的浮点数,基数排序并不是只能用于整数。这里是基数排序的Java实现,并尽量将解释和代码控制在1500字以内。

基数排序的基本思想

基数排序按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

基数排序的Java实现

下面是一个简单的基数排序Java实现,假设我们排序的是非负整数:

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class RadixSort {
    
    // 获取最大数的位数
    public static int getMaxDigit(int[] arr) {
        int maxVal = arr[0];
        for (int value : arr) {
            maxVal = Math.max(maxVal, value);
        }
        int digit = 0;
        while (maxVal != 0) {
            maxVal /= 10;
            digit++;
        }
        return digit;
    }
    
    // 基数排序函数
    public static void radixsort(int[] arr) {
        // 获取最大数的位数
        int m = getMaxDigit(arr);
        
        // 初始化桶
        List<List<Integer>> bucketList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            bucketList.add(new ArrayList<>());
        }
        
        // 对每一位使用稳定的计数排序
        for (int exp = 1; exp <= m; exp *= 10) {
            // 将数据分配到桶中
            for (int i = 0; i < arr.length; i++) {
                int bucketIndex = (arr[i] / exp) % 10;
                bucketList.get(bucketIndex).add(arr[i]);
            }
            
            // 收集桶中的数据
            int index = 0;
            for (List<Integer> bucket : bucketList) {
                for (int value : bucket) {
                    arr[index++] = value;
                }
                bucket.clear(); // 清空桶,为下一次分配做准备
            }
        }
    }
    
    public static void main(String[] args) {
        int[] arr = {170, 45, 75, 90, 802, 24, 2, 66};
        radixsort(arr);
        
        // 输出排序后的数组
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

代码解释

  1. getMaxDigit 方法用于获取数组中最大数的位数,这是为了确定我们需要进行多少次排序(即每一位都需要进行一次排序)。
  2. radixsort 方法是基数排序的主要实现。它首先初始化10个桶(因为我们处理的是十进制数),然后对于每一位(从最低位开始),将数组中的数分配到对应的桶中,然后再从桶中收集数到原数组。这个过程重复进行,直到最高位。
  3. main 方法中,我们创建了一个待排序的数组,并调用 radixsort 方法进行排序。最后,我们输出排序后的数组。

基数排序的特点

  • 基数排序是稳定的排序方法。
  • 基数排序的时间复杂度是O(d*(n+k)),其中d为位数,n是待排数据数量,k是数值范围的个数。
  • 对于一定的n,基数排序的时间复杂度为O(n)。
  • 基数排序的空间复杂度为O(n+k),其中n为待排序列个数,k为数值范围的个数。

基数排序适合用于数值不大,但是数量很多的场合,特别是当数值分布均匀的时候,其效果甚至可以与快速排序和归并排序相媲美。

希望这个简单的基数排序Java实现和解释能够满足您的需求。如果您需要更深入的分析或者对特定部分的解释,请随时告诉我。

相关推荐
.格子衫.3 小时前
Spring Boot 原理篇
java·spring boot·后端
多云几多3 小时前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
Swift社区5 小时前
LeetCode 394. 字符串解码(Decode String)
算法·leetcode·职场和发展
tt5555555555555 小时前
LeetCode进阶算法题解详解
算法·leetcode·职场和发展
让我们一起加油好吗5 小时前
【基础算法】DFS中的剪枝与优化
算法·深度优先·剪枝
Jabes.yang6 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪6 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
Q741_1476 小时前
C++ 模拟题 力扣495. 提莫攻击 题解 每日一题
c++·算法·leetcode·模拟
兮动人6 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR226 小时前
Spring IOC(控制反转)中常用注解
java·spring