十大排序算法之——基数排序算法(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实现和解释能够满足您的需求。如果您需要更深入的分析或者对特定部分的解释,请随时告诉我。

相关推荐
chilavert3181 分钟前
技术演进中的开发沉思-325 JVM:java体系技术全貌(下)
java·开发语言·jvm
chilavert3185 分钟前
技术演进中的开发沉思-324 JVM:java技术体系全貌(上)
java·开发语言
pcm12356710 分钟前
通信服务前沿知识
java
啊阿狸不会拉杆11 分钟前
《机器学习》第六章-强化学习
人工智能·算法·机器学习·ai·机器人·强化学习·ml
Stardep17 分钟前
算法入门20——二分查找算法——搜索插入位置
数据结构·算法·leetcode
qwerasda12385220 分钟前
青豆质量分类识别_YOLOv5_SPDConv_改进算法_目标检测_深度学习_计算机视觉
算法·计算机视觉·分类
晓131325 分钟前
第二章:Redis常见命令与Java客户端
java·数据库·redis
老鼠只爱大米26 分钟前
LeetCode经典算法面试题 #141:环形链表(快慢指针、标记节点等多种方法详细解析)
算法·leetcode·链表·快慢指针·floyd算法·环形链表
invicinble26 分钟前
对于springboot
java·spring boot·后端
alanesnape32 分钟前
什么是字面量?代码中的常量表示方式解析
算法