行业资讯 2025年08月6日
0 收藏 0 点赞 557 浏览 1520 个字
摘要 :

文章目录 基数排序算法思路 算法描述 基数排序的具体步骤 基数排序图解 Java实现基数排序  总结 本文重点讲解Java实现基数排序经典代码和算法思路,并结合图解帮助深入……




本文重点讲解Java实现基数排序经典代码和算法思路,并结合图解帮助深入理解算法原理!

基数排序算法思路

基数排序也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。

有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。

最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。

算法描述

  • 取得数组中的最大数,并取得位数;
  • arr为原始数组,从最低位开始取每个位组成radix数组;
  • 对radix进行计数排序(利用计数排序适用于小范围数的特点);

基数排序的具体步骤

1)根据待排序元素的最大位数确定排序的轮数:首先找到待排序数组中的最大元素,计算出最大元素的位数,将位数作为排序的轮数。

2)对每一位进行排序:从低位到高位,依次对每一位进行排序。

2.1)使用稳定的排序算法(如计数排序或桶排序)对当前位进行排序。
2.2)按照当前位的排序结果重新排列待排序数组。

2)重复步骤2,直到完成所有位的排序。

基数排序图解

基数是什么意思?对于十进制整数,每一位都只可能是0~9中的某一个,总共10种可能。那10就是它的基,同理二进制数字的基为2;对于字符串,如果它使用的是8位的扩展ASCII字符集,那么它的基就是256。

基数排序有两种方法:

  • MSD 从高位开始进行排序
  • LSD 从低位开始进行排序

对于大小范围为0~9的数的组合(若是两位数,就是个位数和十位数的组合),于是可以准备十个桶,然后放到对应的桶里,然后再把桶里的数按照0号桶到9号桶的顺序取出来即可。Java实现基数排序经典代码和算法思路

Java实现基数排序

/**
     * 基数排序
     * @param array
     * @return
     */
public static int[] RadixSort(int[] array) {
  if (array == null || array.length < 2)
    return array;
  // 1.先算出最大数的位数;
  int max = array[0];
  for (int i = 1; i < array.length; i++) {
    max = Math.max(max, array[i]);
  }
  int maxDigit = 0;
  while (max != 0) {
    max /= 10;
    maxDigit++;
  }
  int mod = 10, div = 1;
  ArrayList<ArrayList<Integer>> bucketList = new ArrayList<ArrayList<Integer>>();
  for (int i = 0; i < 10; i++)
    bucketList.add(new ArrayList<Integer>());
  for (int i = 0; i < maxDigit; i++, mod *= 10, div *= 10) {
    for (int j = 0; j < array.length; j++) {
      int num = (array[j] % mod) / div;
      bucketList.get(num).add(array[j]);
    }
    int index = 0;
    for (int j = 0; j < bucketList.size(); j++) {
      for (int k = 0; k < bucketList.get(j).size(); k++)
        array[index++] = bucketList.get(j).get(k);
      bucketList.get(j).clear();
    }
  }
  return array;
}

 总结

以上就是Java实现基数排序经典代码和算法思路的全部内容,希望对你有帮助!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9739.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号