基数排序(Radix Sort)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/691 访问。

基数排序属于“分配式排序”(Distribution Sort),它是透过键值的部份信息,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为  ,其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。


示例: 

public class Program {

    public static void Main(string[] args) {
int[] array = { 43, 69, 11, 72, 28, 21, 56, 80, 48, 94, 32, 8 }; RadixSort(array, 10);
ShowSord(array); Console.ReadKey();
} private static void ShowSord(int[] array) {
foreach (var num in array) {
Console.Write($"{num} ");
}
Console.WriteLine();
} public static void RadixSort(int[] array, int bucketNum) {
int maxLength = MaxLength(array);
//创建bucket时,在二维中增加一组标识位,其中bucket[x, 0]表示这一维所包含的数字的个数
//通过这样的技巧可以少写很多代码
int[,] bucket = new int[bucketNum, array.Length + 1];
for (int i = 0; i < maxLength; i++) {
foreach (var num in array) {
int bit = (int)(num / Math.Pow(10, i) % 10);
bucket[bit, ++bucket[bit, 0]] = num;
}
for (int count = 0, j = 0; j < bucketNum; j++) {
for (int k = 1; k <= bucket[j, 0]; k++) {
array[count++] = bucket[j, k];
}
}
//最后要重置这个标识
for (int j = 0; j < bucketNum; j++) {
bucket[j, 0] = 0;
}
}
} private static int MaxLength(int[] array) {
if (array.Length == 0) return 0;
int max = array[0];
for (int i = 1; i < array.Length; i++) {
if (array[i] > max) max = array[i];
}
int count = 0;
while (max != 0) {
max /= 10;
count++;
}
return count;
//return (int)Math.Log10(max) + 1;
} }

以上是基数排序算法的一种实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/691 访问。

8 11 21 28 32 43 48 56 69 72 80 94

分析:

基数排序算法的时间复杂度为:  ,其中r为所采取的基数,m为堆数。


AlgorithmMan:

AlgorithmMan by Iori,AlgorithmMan是使用C#开发的一套用于算法演示的工具。

下载链接:AlgorithmMan-RadixSort

最新文章

  1. php后台开发(二)Laravel框架
  2. iptables 开启3306端口
  3. C#常用日期格式处理转换[C#日期格式转换大全
  4. VS模板文件修改,自动生成注释
  5. Difference between 2&gt;&amp;-, 2&gt;/dev/null, |&amp;, &amp;&gt;/dev/null and &gt;/dev/null 2&gt;&amp;1
  6. BZOJ_1031_[JSOI2007]_字符串加密_(后缀数组)
  7. jQuery技术内幕电子版5
  8. Linux文件的查找
  9. python的try方法中的else和finally的区别
  10. 团队作业八——第二次团队冲刺(Beta版本)第3天
  11. python画手绘图
  12. python 练习3
  13. 老生常谈:Windows的7类安全漏洞
  14. 基于 Python 和 Pandas 的数据分析(5) --- Concatenating and Appending
  15. mac/linux 修改vim显示信息
  16. 005_ss-link.info的ping探测工具
  17. QrenCode : 命令行下生成二维码图片
  18. 2-nginx 安装
  19. 大数据入门:Maven项目的创建及相关配置
  20. 2017-2018-1 20155317 IPC

热门文章

  1. 根据 Promise/A+ 和 ES6 规范,实现 Promise(附详细测试)
  2. P3756 [CQOI2017]老C的方块
  3. ajax异步上传图片&amp;SpringMVC后台代码
  4. 没想到 Hash 冲突还能这么玩,你的服务中招了吗?
  5. JS 原生ajax写法
  6. 控制语句—for循环、while循环
  7. 云小课|带你揭开IP地址的神秘身份
  8. Redis服务之常用配置(一)
  9. LQB201803乘积尾零
  10. PHP 表单和用户输入讲解