一、思想

基数排序可以看成是桶排序的扩展,以整数排序为例,主要思想是将整数按位数划分,准备 10 个桶,代表 0 - 9,根据整数个位数字的数值将元素放入对应的桶中,之后按照输入赋值到原序列中,依次对十位、百位等进行同样的操作,最终就完成了排序的操作。

二、图解过程

三、核心代码

// 基数排序
public static void radixSort(int[] arr) {if (arr == null || arr.length < 2) {return;}radixSort(arr, 0, arr.length - 1, maxbits(arr));
}// 计算最大位数
public static int maxbits(int[] arr) {int max = Integer.MIN_VALUE;for (int i = 0; i < arr.length; i++) {max = Math.max(max, arr[i]);}int res = 0;while (max != 0) {res++;max /= 10;}return res;
}// 基数排序
public static void radixSort(int[] arr, int begin, int end, int digit) {final int radix = 10;int i = 0, j = 0;int[] count = new int[radix];int[] bucket = new int[end - begin + 1];// 依次遍历每个位数for (int d = 1; d <= digit; d++) {for (i = 0; i < radix; i++) {count[i] = 0;}// 统计数量for (i = begin; i <= end; i++) {j = getDigit(arr[i], d);count[j]++;}// 计算位置for (i = 1; i < radix; i++) {count[i] = count[i] + count[i - 1];}// 记录到对应位置for (i = end; i >= begin; i--) {j = getDigit(arr[i], d);bucket[count[j] - 1] = arr[i];count[j]--;}for (i = begin, j = 0; i <= end; i++, j++) {arr[i] = bucket[j];}}
}// 获取位数数值
public static int getDigit(int x, int d) {return ((x / ((int) Math.pow(10, d - 1))) % 10);
}

四、复杂度分析

1. 时间复杂度:O(k*(n+m))

k 为关键字个数,本文的上述距离关键字为 2 个,分别是个位和十位;m 为 关键字的取值范围,本文的举例关键字取值范围 m 为 10(0 - 9);n 为待排序序列的元素数量。

总共遍历 k 遍,每一遍包含:将每个元素放进桶中(n) 与 将桶中元素收回到原序列中(m),所以时间复杂度为 O(k*(n+m))。

2. 额外空间复杂度:O(n+m)

m 个桶与存放 n 个元素的空间。

五、稳定性分析

基数排序不会改变相同元素之间的相对位置,仔细思考一下过程,元素收回的过程中是从后向前进行的。

所以,基数排序是稳定的排序算法。

【排序】图解基数排序相关推荐

  1. 排序算法10——图解基数排序(次位优先法LSD和主位优先法MSD)

    排序算法1--图解冒泡排序及其实现(三种方法,基于模板及函数指针) 排序算法2--图解简单选择排序及其实现 排序算法3--图解直接插入排序以及折半(二分)插入排序及其实现 排序算法4--图解希尔排序及 ...

  2. 算法笔记-桶排序代码与原理、非比较排序、计数排序、基数排序、C#代码

    1. 计数排序 原理: 计数排序需要用到桶,其核心是不通过比较来获得数的大小,以桶的方式存数来计数 举例来说,一个数组是{3 2 2 1 3 5},共6个数,那么我们需要准备5个有序桶,即1号桶.2号 ...

  3. 计数排序,基数排序,桶排序

    转 http://blog.163.com/yuyang_tech/blog/static/216050083201382055821953/ 与合并排序,堆排序,快速排序等基于比较的排序算法不同,计 ...

  4. 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

    //实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...

  5. 排序算法之计数排序、基数排序和桶排序

    转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...

  6. 八十五、再探希尔排序,桶排序,计数排序和基数排序

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 关于排序,其实还有很多,比如常见的希尔排序,桶排序,计数排序和基数排 ...

  7. 排序算法:桶排序、计数排序、基数排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 这篇博客将主要介绍三种时间复杂度是 ...

  8. 计数排序、桶排序和基数排序

    计数排序 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法. 由于用来计数的数组C的长度取决于待排序数组中数据的 ...

  9. 计数排序vs基数排序vs桶排序

    从计数排序说起 计数排序是一种非基于元素比较的排序算法,而是将待排序数组元素转化为计数数组的索引值,从而间接使待排序数组具有顺序性. 计数排序的实现一般有两种形式:基于辅助数组和基于桶排序. 基于辅助 ...

  10. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

最新文章

  1. 设计模式 — 行为型模式 — 迭代器模式
  2. 常见计算机问题 内存篇
  3. 根据txt中的文件名将文件复制到目标文件夹中
  4. log4j.properties
  5. boost::mp11::mp_defer相关用法的测试程序
  6. mysql的函数用途_MYSQL小函数大用途之-------FIND_IN_SET
  7. java关键字 valotile_Java内存模型-jsr133规范介绍,java中volatile关键字的含义
  8. 盘点中兴通讯强悍的战斗力
  9. Codeforces Round #401 (Div. 2) C Alyona and Spreadsheet —— 打表
  10. Docker终失C位,开源少年缘何黑化
  11. mysql 刚安装完的用户_mysql 离线安装后用户初始化
  12. Xcode 9.0 报错, Safe Area Layout Guide Before IOS 9.0 和launch screens may not set custom classnames报错
  13. MFC-利用内存映射文件来读写文件
  14. notifier通知链机制
  15. 183. Customers Who Never Order没有下过订单的顾客MySQL
  16. 华为手机android7价格,价格坚挺的国产之光——华为NOVA 7 SE 5G手机开箱
  17. wince 蓝牙 --转载
  18. 长径比4.0金纳米棒直径4.2nm|长径比3.4金纳米棒直径10nm 长度34nm|长径比3.9金纳米棒直径10nm 长度39nm
  19. 014 非常好用的广告净化器
  20. Tomcat配置虚拟目录

热门文章

  1. allegro差分信号走线_原创|PCB设计软件allegro16.6演示差分规则的设置
  2. UE4材质篇--水材质
  3. 【C】C语言打开,读取文件
  4. mybatis黑马:一级缓存和二级缓存
  5. Linux简介-远程操作-文本编辑器-1
  6. 张飞硬件开发视频第五部电路详细讲解,纯硬件也可以做PWM波
  7. vue项目依赖安装报错:Error: pngquant failed to build, make sure that libpng-dev is installed
  8. 企业律师事务官方网站源码
  9. 最新 IntelliJ IDEA 详细配置步骤(图文版)
  10. 使用字节流和字符流对文件进行操作