基数排序(桶排序)介绍:

  1. 基数排序(RadixSort)属于“分配式排序”(DistributionSort),又称“桶子法”(Bucket Sort)顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用
  2. 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序
  3. 基数排序(RadixSort)是桶排序的扩展,以空间换取时间
  4. 基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。

基本思想

  1. 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
  2. 这样说明,比较难理解,下面我们看一个图文解释,理解基数排序的步骤数组的初始状态arr{53,3,542,748,14,214}
  3. 第一轮排序:
    • 将每个元素的个位数取出,然后看这个数应该放在哪个对应的桶(一个一维数组)
    • 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
    • 第一轮排序后arr{542,53,3,14,214,748}
  4. 第二轮排序:
    • 将每个元素的十位数取出,然后看这个数应该放在哪个对应的桶(一个一维数组)
    • 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
    • 第二轮排序后arr{3,14,214,542,748,53}
  5. 第三轮排序:
    • 将每个元素的百位数取出,然后看这个数应该放在哪个对应的桶(一个一维数组)
    • 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)
    • 第三轮排序后arr{3,14,53,214,542,748}
      特别注意!!! 特别注意!!! 特别注意!!!

有负数的数组,我们不用基数排序来进行排序,如果要支持负数那么我们的代码还需要改进。在取数据的时候进行绝对值选取,存的时候要反转。

代码实现

package com.sort;import java.util.Arrays;public class RadixSort {public static void main(String[] args) {int[] arr = { 53, 3, 542, 748, 14, 214 };radixSort(arr);}public static void radixSort(int[] arr) {// 基数排序简化// 1.得到最大的位数int max = arr[0];// 假设最大数是第一个for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}// 得到最大数是几位数int maxLength = (max + "").length();// 定义一个二维数组,表示10个桶,每个桶就是一个一维数组// 说明// 1.二维数组包含10个一维数组// 2.为了防止数据溢出,则每个一维数组的大小定义为arr.lenght// 3.很明确,基数排序是用空间换时间的经典算法int[][] bucket = new int[10][arr.length];// 为了记录每个桶中实际存放了多少个数据,我们定义一个以为数组来记录各个桶中的每次放入的数据个数// 比如:bucketElementCounts[0]记录的就是bbucket[0]桶的放入数据个数int[] bucketElementCounts = new int[10];// 使用循环将代码处理for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {// 排序(针对每一个元素的对应位进行排序处理),第一次 个位,第二次 十位,第三次 百位。。。。。。for (int j = 0; j < arr.length; j++) {// 取出每个元素对应位的数据int digitOfElement = arr[j] / n % 10;// 放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];bucketElementCounts[digitOfElement]++;}// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)int index = 0;// 遍历每一个桶,并将桶中的数据放入到原数组for (int k = 0; k < bucketElementCounts.length; k++) {// 如果桶中有数据我们才放入到原数组if (bucketElementCounts[k] != 0) {// 循环该桶,即第k个一维数组for (int l = 0; l < bucketElementCounts[k]; l++) {// 取出元素放到arrarr[index++] = bucket[k][l];}}// 每一轮处理后需要将每一个bucketElementCounts置0bucketElementCounts[k] = 0;}System.out.println("第" + (i + 1) + "轮,个位排序处理" + Arrays.toString(arr));}
/**每一步的思路代码// 第一轮排序(针对每一个元素的个位进行排序处理)for (int j = 0; j < arr.length; j++) {// 取出每个元素的个位int digitOfElement = arr[j] % 10;// 放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];bucketElementCounts[digitOfElement]++;}// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)int index = 0;// 遍历每一个桶,并将桶中的数据放入到原数组for (int k = 0; k < bucketElementCounts.length; k++) {// 如果桶中有数据我们才放入到原数组if (bucketElementCounts[k] != 0) {// 循环该桶,即第k个一维数组for (int l = 0; l < bucketElementCounts[k]; l++) {// 取出元素放到arrarr[index++] = bucket[k][l];}}// 每一轮处理后需要将每一个bucketElementCounts置0bucketElementCounts[k] = 0;}System.out.println("第1轮,个位排序处理" + Arrays.toString(arr));// -------------------------------------------------------// 第2轮排序(针对每一个元素的十位进行排序处理)for (int j = 0; j < arr.length; j++) {// 取出每个元素的十位int digitOfElement = arr[j] / 10 % 10;// 放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];bucketElementCounts[digitOfElement]++;}// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)index = 0;// 遍历每一个桶,并将桶中的数据放入到原数组for (int k = 0; k < bucketElementCounts.length; k++) {// 如果桶中有数据我们才放入到原数组if (bucketElementCounts[k] != 0) {// 循环该桶,即第k个一维数组for (int l = 0; l < bucketElementCounts[k]; l++) {// 取出元素放到arrarr[index++] = bucket[k][l];}}// 每一轮处理后需要将每一个bucketElementCounts置0bucketElementCounts[k] = 0;}System.out.println("第2轮,个位排序处理" + Arrays.toString(arr));// -----------------------------------------------------// 第3轮排序(针对每一个元素的百位进行排序处理)for (int j = 0; j < arr.length; j++) {// 取出每个元素的百位int digitOfElement = arr[j] / 100 % 10;// 放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];bucketElementCounts[digitOfElement]++;}// 按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)index = 0;// 遍历每一个桶,并将桶中的数据放入到原数组for (int k = 0; k < bucketElementCounts.length; k++) {// 如果桶中有数据我们才放入到原数组if (bucketElementCounts[k] != 0) {// 循环该桶,即第k个一维数组for (int l = 0; l < bucketElementCounts[k]; l++) {// 取出元素放到arrarr[index++] = bucket[k][l];}}// 每一轮处理后需要将每一个bucketElementCounts置0bucketElementCounts[k] = 0;}System.out.println("第3轮,个位排序处理" + Arrays.toString(arr));*/}
}

基数排序(桶排序)思路分析及代码实现相关推荐

  1. PTA 统计工龄 思路分析及代码解析

    PTA 统计工龄 思路分析及代码解析v0.6 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 1. ...

  2. 2022华数杯B题论文思路分析+完整代码(水下机器人组装计划)(一二问答案接出来和标准答案一样)(问题三四逼近正确答案)(完整论文,代码可直接跑)

    写在前面:学校最近搞数学建模竞赛培训,以2022华数杯B题作为训练题目,在查资料过程中发现网上没有哪一篇论文解出了正确答案,而我们组利用Lingo软件准确的解出了正确答案,但是在第三问时,由于决策的变 ...

  3. PTA 电话聊天狂人 思路分析及代码解析

    PTA 电话聊天狂人 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 ...

  4. PTA 旅游规划(邻接矩阵) 思路分析及代码解析

    PTA 旅游规划 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) 三.具体实 ...

  5. PTA 旅游规划(邻接表) 思路分析及代码解析

    PTA 旅游规划_使用邻接表 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...

  6. PTA 树的同构 思路分析及代码解析

    PTA 树的同构 思路分析及代码解析 v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 2. 思路分析(重点) 三.具体实现 1. 弯路和bug 2. 代码框 ...

  7. PTA 哈利·波特的考试 思路分析及代码解析

    PTA 哈利·波特的考试 思路分析及代码解析v0.9.1 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...

  8. PTA QQ帐户的申请与登陆 思路分析及代码解析

    PTA QQ帐户的申请与登陆 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具 ...

  9. 清华计算几何大作业思路分析和代码实现

    清华计算几何大作业思路分析和代码实现 1. 计算几何之缘 2. 前置知识 3. 作业列表 4. 作业难度分析和选取建议 4.1 初阶(新手村之旅) 4.2 高阶(大师剑之旅) 4.3 终阶(折磨之旅) ...

最新文章

  1. Java 编程下使用 Class.forName() 加载类
  2. python画圆简单代码-Python画直线 画圆 画矩形代码
  3. Cookie和会话状态 (转)
  4. mysql远程服务器访问数据库
  5. Java线程:新特征-有返回值的线程(转)
  6. leetcode 446. Arithmetic Slices II - Subsequence | 446. 等差数列划分 II - 子序列(动态规划)
  7. BZOJ1509: [NOI2003]逃学的小孩(树的直径)
  8. leetcode97 交错字符串
  9. 4003基于邻接表的新顶点的增加(C++,附详细解析)
  10. Unity工程中 .Meta 文件的来龙去脉
  11. 在线数学函数画图工具 2D 3D
  12. boa服务器如何运行cgi,BOA服务器与CGI
  13. android room 教程,Android Room的使用详解
  14. 最新弹幕播放器源码/支持对接苹果+蓝光接口API
  15. 手游自动化测试基础:方法及流程
  16. H3C SecParh堡垒机任意用户登录与远程执行代码漏洞
  17. 均方根误差(RMSE)、平均绝对误差(MAE)、标准差
  18. B BL BLX BX详解
  19. 【Unity/C#】游戏出现区域性崩溃,深藏的国际化巨坑
  20. 投资欢喜传媒的B站,有着怎样的内容焦虑?

热门文章

  1. Oracle手动建库常见问题
  2. Summaries and TensorBoard
  3. 六问禅道5:需求和Bug的区别
  4. Pycharm打开Project(工程)时停留在preparing workspace时间过长,导致打开很慢的解决方法...
  5. android 页面默认不弹软键盘_Android避免进入页面自动弹出软键盘(真正好用)
  6. Android App开发语音处理之系统自带的语音引擎、文字转语音、语音识别的讲解及实战(超详细 附源码)
  7. Python 第二十八章 网络初识+五层协议+三次握手四次挥手
  8. banner中居中的page显示完全,其余显示百分之20--仿网易云首页轮播图
  9. Whitelabel Error Page 的原因分析
  10. html表头纵向,实现纵向表头的table