已发布:

【算法知识】详解选择冒泡算法

【算法知识】详解选择排序算法

【算法知识】详解插入排序算法

【算法知识】详解快速排序算法

【算法知识】详解归并排序算法

基本思想

基数排序的思想是将整数按位数切割成不同的数字,然后按每个位数分别比较从而得到有序的序列。

例子

本文以数组中元素均为正整数来演示思想。
给定一个数组 arr = [ 6, 56, 89 , 12 ,39 ,21,11,156,657 ];
初始状态如下:

初始状态

按照个位装桶
十进制的每位数字都是从0-9的,所以我们分配10个桶,每个桶有一定的容量(本文将设定为数组长度大小);

定义桶

第一轮先按照个位数进行装桶,6的个位数为6,所以将其放入代表数字6的桶;

按照个位装桶图1

56的个位数也为6,所以也将其放入代表数字6的桶;

按照个位装桶图2

以此类推,将每一个数按照个位数字进行装桶,如下:

按照个位装桶最终图

然后按照这个顺序将它们放回原数组,即为:

[ 11,21,12,6,56,156,657,89,39 ];

如下图:

按照各位放回原数组放回原数组

按照十位装桶
10的十位数字是1;
21的十位数字是2;
12的十位数字是1;
6的十位数字是0;
...
如此将它们按照十位数字进行装桶如下:

按照十位进行装桶

然后再按照这个顺序放回原数组如下:

[ 6,11 ,12, 21,39,56,156,657,89];

如下图

按照十位数字放回原数组

按照百位进行装桶
6的百位是0;
11的百位是0;
12的百位也是0;
同理21,39,56的百位都是0;
156的百位是1;
... 等等
按照百位进行装桶如下:

按照百位装桶

再按照百位放回原数组如下:

[ 6,11 ,12, 21,39,56,89,156,657];

如下图:

按照百位放回数组

此时从最低为到最高位都已经装桶放回完毕,已经有序。

代码

像上面的例子,我们知道最大位数是百位,但是计算机没有肉眼,需要用程序进行求解,得到位数如下:

int maxNum = arr[0]; //假设第一数就是最大数
for (int i = 1; i < arr.length; i++) {if (arr[i] > maxNum) maxNum = arr[i];}
}
//得到位数
int maxLength = (maxNum + "").length();

整体代码

import java.util.Arrays;public class Solution {public static void main(String[] args) {int arr[] = {6, 56, 89, 12, 39, 21, 11, 156, 657};radixSort(arr);}public static void radixSort(int[] arr) {//得到数组中最大的数的位数int maxNum = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > maxNum) {maxNum = arr[i];}}//得到最大数是几位数int maxLength = (maxNum + "").length();//定义一个二维数组,表示10个桶, 每个桶就是一个一维数组int[][] bucket = new int[10][arr.length];//每个桶存入了几个数字int[] everyBucketNum = new int[10];// n* = 10 的原因是//123取出个位数字是 123 % 10,即 123 / 1 %10//123 取出十位数字是123 / 10 % 10;//123 去除百位数字是123 /100 % 10//以此类推for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {for (int j = 0; j < arr.length; j++) {//取出每个元素的对应位的值int digit = arr[j] / n % 10;//放入到对应的桶中bucket[digit][everyBucketNum[digit]] = arr[j];everyBucketNum[digit]++;}//按照这个桶的顺序(一维数组的下标依次取出数据,放入原来数组)int index = 0;//遍历每一桶,并将桶中是数据,放入到原数组for (int k = 0; k < everyBucketNum.length; k++) {if (everyBucketNum[k] != 0) {for (int l = 0; l < everyBucketNum[k]; l++) {arr[index++] = bucket[k][l];}}//放回原数组后,需要将每个 everyBucketNum[k] = 0everyBucketNum[k] = 0;}System.out.println("第" + (i + 1) + "轮,对个位的排序处理 arr =" + Arrays.toString(arr));}}
}

时间复杂度

由代码可知,时间复杂度为 ;

稳定性:

在基数排序过程中,每一次装桶都是将当前位数上相同数值的元素进行装桶,并不需要交换位置。所以基数排序是稳定的算法。

拓展

如果负数可以使用正负数桶,负数的排负数,正数的排正数,然后就可以达到要求。还有其他更好的,本文不过多介绍,大家可以自行查阅资料。

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习在线手册AI基础下载(pdf更新到25集)本站qq群1003271085,加入微信群请回复“加群”获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am喜欢文章,点个在看

【算法知识】详解基数排序算法相关推荐

  1. xgboost算法_详解xgboost算法的样本不平衡问题

    XGBoost官方文档对参数scale_pos_weight的定义: 翻译: 调节正负样本权重的平衡 ,常用来处理不平衡的正负样本数据 . 典型值算法: scale_pos_weight = 负样本总 ...

  2. 什么是DES算法,详解DES算法的基本原理

    DES算法是应用最为广泛的对称加密算法.它主要应用在计算机网络通信.电子资金传送系统.保护用户文件,此外,DES还可用于计算机用户识别系统中.那么,具体什么是DES算法,DES算法的基本原理是什么,本 ...

  3. 【算法知识】详解堆排序算法

    点击蓝色字关注我们! 什么是堆 「堆」首先是一个完全二叉树,「堆」分为「大顶堆」和「小顶堆」: 「大顶堆」 : 每个节点的值大于或等于其左右孩子节点的值,称为大顶堆. 「小顶堆」同理就是每个节点的值小 ...

  4. 游戏洗牌算法——常用+详解最优Knuth_Durstenfeld算法

    目录 前言 基于Unity的洗牌算法代码实现 内容 抽牌洗牌 原理 复杂度 优缺点 Fisher_Yates算法 原理 复杂度 代码实现 优缺点 Knuth_Durstenfeld算法(最佳洗牌算法) ...

  5. 【算法知识】详解归并排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 基本思想 归并排序的基本思想是: 先将序列一次次分成子序列,直到子序列 ...

  6. 【算法知识】详解快速排序算法

    基本思想 已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 本文的思路是以从小到大为例讲的. 快速排序的基本思想是任取待排序序列的一个元素作为中心元素 ...

  7. js排序算法详解-基数排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-基数排序 其实基数排序和桶排序挺类似的,都是找一个容器把属于同一类的元素装起来,然后进行排序.可以把基数排序类 ...

  8. JavaScript数据结构与算法——列表详解(上)

    列表是一组有序的数据,每个数组中的数据项称为元素.数组相关知识不够了解的伙伴可以阅读本人上篇博客在JavaScript中,列表的元素可以是任意数据类型.列表中可以保存不定数量的元素,实际使用时元素的数 ...

  9. [转]数据结构KMP算法配图详解(超详细)

    KMP算法配图详解 前言 KMP算法是我们数据结构串中最难也是最重要的算法.难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维.真正理解代码的人可以说对KMP算法的了解已经相当深入了.而 ...

最新文章

  1. Android DataBinding之初体验
  2. TOJ 1702.A Knight's Journey
  3. c语言程序框一点数字就消失,你用C语言编程时,会犯下面的错误吗?
  4. AliOS Things 硬件抽象层(HAL)对接系列2 — SPI driver porting
  5. php用smarty模板语法,Smarty模版设计基本语法
  6. 用 bmon 实时查看网络流量
  7. 构建复杂的应用程序(二)—— visual studio 下 C/C++ 项目开发
  8. python实现邮件客户端_SMTP邮件客户端Python
  9. AMS1117-3.3电源芯片损坏分析
  10. java高级工程师个人简历模板
  11. python中dateutil库用法详解
  12. 计算机网络常见面试题总结
  13. 计算机设备中运行速度最慢,决定电脑运行速度快慢的硬件因素
  14. MySQL必知必会——语句总结
  15. Eagle电路板绘制
  16. html中如何访问ftp中的图片,CSS FTP上传网页图解教程
  17. C#--如何用字符串组成的逻辑表达式进行判断,如:“7>2(4<7||8>4)“,字符串写的逻辑表达式来进行判断(只需3步)
  18. 【Camera基础(一)】Camera摄像头工作原理及整机架构
  19. java web中的导出excel_JAVA语言之怎么在JavaWeb中导出Excel
  20. 阿里云消息服务(Message Service)-基本概念

热门文章

  1. 阿里云服务器购买后的配置指南
  2. 洛谷 P2908 [USACO08OPEN]文字的力量Word Power
  3. Oracle存储过程小解
  4. 去除表单元素的默认样式
  5. Zen Coding css,html缩写替换大观 快速写出html,css
  6. 编程中定义的方法报异常问题
  7. COJ1005(Binary Search Tree analog)
  8. 如何用SPSS做协方差分析?超详细图文教程
  9. centos查看网关地址
  10. python短期预测图_Python中利用长短期记忆模型LSTM进行时间序列预测分析