基数排序

介绍

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

图解

排序思想

将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直 到最高位排序完成以后,数列就变成-一个有序序列。

理解

也就是说我们把各位数字统计下来放到对应的那个位置,比如3我们就把他放到3那一列,41就放到1那一列,那3是一位数怎么办,前面补一个零也就是03,那么3那一列就是我们的一个桶,1也是一个桶,51也在1这个桶,同理23也在3那个桶

也就是说我们0—9有10个桶(不一定正好有10个桶)

题目:科大一伙人有如下成绩:53,3,542,748,14,214,请用基数排序的方法将这些人的成绩从小到大排序

步骤

1.将每个元素的个位数取出,然后将这个数放在对应的桶(桶就是一个一位数组)中

2.按照这个桶的顺序(一维数组下标)依次取出数据,放回原数组

3.数组的第一轮排序

542 53 3 14 214 748

4.按照刚才的操作将542 53 3 14 214 748再来一次,不过这次是去十位数字来规定我们的桶

0桶 3

1桶 14 214

4桶 542 748

5桶 53

放回原数组

5.第二轮排序结果

3 14 214 542 748 53

6.第三轮,同理就是在第二轮排序的基础上,按照百位数字来规定我们的桶

0桶 3 14 53

2桶 214

5桶 542

7桶 748

第三次排序的结果

3 14 53 214 542 748就是我们最终的结果了

我们可以看出,并没有递归的步骤,一共需要多少次呢?取决于我们数组中最大数的位数,这个数组最大的748的最大位数是百位所以就是3位,4位数的话就需要4次

推导代码

 //基数排序方法public static void radixSort(int[] arr){//第一轮排序(针对每个元素的个位进行排序)//定义一个二维数组,表示10个桶,每个桶就是一个一位数组//说明//1.二维数组包含10个一位数组,但是一位数组要多大?//2.为了防止再放入数字的时候,数据溢出,则我们每个一位数组(桶)大小定位arr.length//基数排序也就是空间换时间的算法int[][] bucket = new int[10][arr.length];//这个桶要多大?//我们怎么把数据从桶中取出来呢?我们桶中实际有多少个数据呢?//为了记录,我们定义一个一维数组来记录各个桶中每次放入的个数//bucketElementCounts[0]就是记录0桶中有几个数据int[] bucketElementCounts = new int[10];//第一轮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个桶,即第k个一维数组for(int l = 0;l < bucketElementCounts[k];l++){//取出元素,放回原数组arr[index] = bucket[k][l];index++;}//第一轮取出数据后,需要将每个bucketElementCounts[k] = 0//为了我们第二轮第三轮处理的时候,没有数据bucketElementCounts[k] = 0;}}System.out.println("第一轮对个位的排序处理"+Arrays.toString(arr));//第二轮处理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个桶,即第k个一维数组for(int l = 0;l < bucketElementCounts[k];l++){//取出元素,放回原数组arr[index] = bucket[k][l];index++;}bucketElementCounts[k] = 0;}}System.out.println("第二轮对十位的排序处理"+Arrays.toString(arr));//第三轮for(int j = 0;j < arr.length;j++){//取出个位数字int digitOfElement = arr[j] /100;//放入到对应的桶中bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];bucketElementCounts[digitOfElement]++;}//重新放回原数组index = 0;//遍历每一个桶,并将桶中的数据放入到原数组for(int  k = 0; k < bucketElementCounts.length;k++){//如果桶中有数据if(bucketElementCounts[k] != 0){//循环该桶  即第k个桶,即第k个一维数组for(int l = 0;l < bucketElementCounts[k];l++){//取出元素,放回原数组arr[index] = bucket[k][l];index++;}bucketElementCounts[k] = 0;}}System.out.println("第三轮对百位的排序处理"+Arrays.toString(arr));}

最终代码

import java.util.Arrays;//基数排序
//@author   王庆华
//2021年1月14日13:39:02
public class RadioxSort {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();//变成字符串int[][] bucket = new int[10][arr.length];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个桶,即第k个一维数组for(int l = 0;l < bucketElementCounts[k];l++){//取出元素,放回原数组arr[index] = bucket[k][l];index++;}//第一轮取出数据后,需要将每个bucketElementCounts[k] = 0//为了我们第二轮第三轮处理的时候,没有数据bucketElementCounts[k] = 0;}}System.out.println("第"+(i+1)+"轮对个位的排序处理"+Arrays.toString(arr));}}
}

算法笔记-------基数排序相关推荐

  1. 算法笔记——基数排序

    基数排序(radix sort)是桶排序的扩展,是一种多关键字排序算法.按关键字分别排序. 若记录按照一个数值型的关键字排序,则可以把该关键字看作由d位组成的多关键字排序,每一位的取值范围都为[0,r ...

  2. 数据结构与算法笔记(青岛大学王卓老师视频)

    写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...

  3. 考研算法笔记(排序)

    考纲 (只考虑内部排序) 1插入排序(直插(稳),希尔) 2交换排序(冒泡(稳),快排) 3选择排序(简选,堆排) 4归并排序(稳) 5基数排序(稳) 6算法笔记 对任意n个关键字排序的比较次数至少为 ...

  4. JS数据结构与算法 笔记

    JS数据结构与算法笔记 前言:不定时更新说明 1. 栈(Stack) 1.1 基于数组实现栈 1.2 基于对象实现栈 1.3 基于链表实现栈 1.4 栈的简单应用 1.4.1 字符串中的括号匹配问题 ...

  5. 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...

    来源:专知本文为资源,建议阅读5分钟本文为你分享<算法笔记>中文版. https://github.com/Dairongpeng/algorithm-note 目录概览 第一节 复杂度. ...

  6. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

  7. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  8. 数据结构与算法笔记(十五)—— 散列(哈希表)

    一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...

  9. 《algorithm-note》算法笔记中文版正式发布!

    无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...

  10. 【算法】《algorithm-note》算法笔记中文版正式发布!

    无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...

最新文章

  1. 百度开源,分布式配置中心
  2. Linux目录、文件的创建与删除
  3. Apache启动错误:could not bind to address[::]:443
  4. python三大器_Python - 三大器 迭代器,生层器,装饰器
  5. laravel5.2 增加Caffienate Modules,实现模块化开发
  6. 开源一个适用iOS的数据库表结构更新机制的代码
  7. java毕业设计_高校后勤管理系统
  8. win10绝地求生游戏崩溃怎么解决
  9. 计算机系统概论(原书第2版)部分课后习题答案(第三章)
  10. 分享10个最佳Linux VPS服务器托管
  11. manjaro双屏显示
  12. 联想微型计算机c365,联想C365一体机如何用u盘重装系统
  13. FPGA中LUT初步学习
  14. matlab如何写不等于号,不等于号(不等于号可以往右写么)
  15. win10老是弹出计算机管理器,win10系统Ie11老是弹出“管理加载项”提示框取消的处理办法...
  16. mysql如何插入图片和视频_mysql中怎样插入图片
  17. 帅到没朋友 (20分)
  18. idea条件断点和异常断点
  19. mchain r语言_布林带交易策略R语言实现
  20. linux系统查看主板cpu,Linux下使用lm_sensors查看主板和CPU温度

热门文章

  1. 多元线性回归模型_Eviews系列3|经典线性回归模型之相关分析及多元线性回归分析...
  2. sql不写parametertype_Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个sql的parameterType的类型相同...
  3. python mount回调函数_python类(4)——自己造第一个轮子
  4. maya python 游戏与影视编程指南_Maya Python 游戏与影视编程指南
  5. matlab 矩阵维度一致,错误使用 / 矩阵维度必须一致。
  6. MyBatis学习笔记(2)-MyBatis入门
  7. Jnotify文件监控的用法以及Jar文件导入的方法
  8. 论文笔记_S2D.19_2018-PR_基于膨胀卷积神经网络与软加权和推理的分层融合单目深度估计
  9. ML/DL-复习笔记【三】- 算法的评价指标
  10. CVPR 2020-FaceShifter:能够应对脸部遮挡的高保真换脸方法