基数排序

时间复杂度:Θ(d(n+k))
d:元素的位数,k元素中每位数的取值区间大小
非原址排序
1⃣️特点该排序只能每次为基数为1位数进行排序

void radix_sort(int *array,int length,int digits){vector<KeyValuePair> temp_array(length);for (int i = 0; i < length; ++i) {temp_array[i].value = array[i];}for (int i = 0; i < digits; ++i) {for (int j = 0; j < length; ++j){temp_array[j].key = (temp_array[j].value / (int) pow(10,i)) % 10;}counting_sort_by_key(temp_array);}for (int i = 0; i < length; ++i) {array[i] = temp_array[i].value;}
}

辅助类:KeyValuePair
链接地址
辅助排序 counting_sort_by_key
链接地址

2⃣️以多位数 r 为基础进行排序(r<=b,b为总位数),不在是一位一位的排序
时间复杂度Θ((b/r)(n+2^r))。
通常情况下,若b = O(lgn),取r≈lgn,则基数排序的运行时间为Θ(n)。

void radix_sort(int *array,int length,int total_digits,int single_digit){vector<KeyValuePair> temp_array(length);for (int i = 0; i < length; ++i) {temp_array[i].value = array[i];}for (int i = 0 ; i < total_digits; i += single_digit) {for (int j = 0; j < length; ++j){temp_array[j].key = (temp_array[j].value / (int) pow(10,i)) % ((int) pow(10,single_digit));}counting_sort_by_key(temp_array,-(int) pow(10,single_digit),(int) pow(10,single_digit));}for (int i = 0; i < length; ++i) {array[i] = temp_array[i].value;}
}

3⃣️基数排序的诡异版本
基数排序的不在以10进制分割,而是以任意大于1的自然数(代码中的range)分割。
参数 range 取值大于n时一定成功,小于n时不一定成功。有兴趣的同学可以共同探讨下。
时间复杂度Θ(log(range,max{ |array中元素|})(n+2range))

void radix_sort_by_range(int *array,int length,int range)
{vector<KeyValuePair> temp_array(length);for (int i = 0; i < length; ++i) {temp_array[i].value = array[i];}int i = 0;bool interrupt = true;while (true){interrupt = true;for (int j = 0; j < length; ++j){temp_array[j].key = (temp_array[j].value / (int) pow(range,i)) % range;interrupt = interrupt && !temp_array[j].key;}if(interrupt)break;i++;counting_sort_by_key(temp_array,-range,range);}for (int i = 0; i < length; ++i) {array[i] = temp_array[i].value;}
}

vector容器版本

void radix_sort(vector<int> &array,int digits)
{vector<KeyValuePair> temp_array(array.size());for (int i = 0; i < array.size(); ++i) {temp_array[i].value = array[i];}for (int i = 0; i < digits; ++i) {for (int j = 0; j < array.size(); ++j){temp_array[j].key = (temp_array[j].value / (int) pow(10,i)) % 10;}counting_sort_by_key(temp_array);}for (int i = 0; i < array.size(); ++i) {array[i] = temp_array[i].value;}
}

算法-排序-基数排序(对任意整数排序)相关推荐

  1. 【算法基础】十大经典排序算法(动图)

    算法分类 冒泡排序(重点) 选择排序 插入排序 归并排序(重点) 快速排序(重点) 堆排序(重点) 计数排序 基数排序 本文的重点排序方法在:冒泡排序,归并排序,快速排序,桶排序. 文末有学习资料免费 ...

  2. 按复杂度有效性递减排序_十大经典排序算法:python源码实现,通俗深入讲解

    概述 提示:本文上万字,陆陆续续疏理知识点加测试代码,耗时近一个月.阅读时长40分钟左右. 本文将十大经典排序算法进行汇总,从源码实现.复杂度.稳定性进行分析,并对每种排序的特性进行点评.对典型算法, ...

  3. 【每日算法】基数排序算法

    1)算法简介 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用 ...

  4. problem a: 简单的整数排序_什么是基数排序?

    老读者可能比较熟悉,刚开始的时候写了一个排序算法系列,把常见的排序算法都写了,有兴趣的可以在公众号内的目录菜单栏中选择数据结构与算法查看. 但是还是有少数的排序算法没写,下面的一篇就是.这篇文章用漫画 ...

  5. 排序算法-08基数排序(python实现)

    基数排序 前言 这就是整个排序算法的最后一篇了,再深入的后来提出的排序算法基本上是基于这8中基本的排序算法,不做过多赘述. 概述 这是完全不同于之前的排序理念的一种排序方式,它是非基于比较的整形数据排 ...

  6. C语言必学的12个排序算法:基数排序

    # 基本思想 基数排序(radix sort),同样时一种非比较的内部排序算法,主要基于多关键字排序的思想进行排序,它将单个关键字按照基数分成"多个关键字"进行排序.例如整数789 ...

  7. 九大经典算法之基数排序、桶排序

    08 基数排序(Radix Sort) 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.排序过程是将所有待比较数值统一为同样的数位长度,数位较短的数前 ...

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

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

  9. 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)

    排序也叫排序算法,排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类: 1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序. 2)外部排序:数据量过大,无法全部加载到内存中,需要 ...

最新文章

  1. Four ugliness
  2. 从一年关店千家到营利双增,都市丽人做对了什么?
  3. WatchDog工作原理
  4. ThinkPhp5 | 模块分析
  5. 计算机在职考研一月联考院校,在职研究生一月联考的分数线是多少?
  6. mysql不能正常yum remove怎么办?--noscripts
  7. Hibernate缓存基础知识
  8. C++ 继承中的同名成员的情况01
  9. Android的电话拨号器
  10. “再见,Linux!”
  11. POJ 3268 Bookshelf 2 动态规划法题解
  12. 更新sql语句 sql注入_SQL更新语句– SQL中的更新查询
  13. Flutter进阶第13篇: 打开外部浏览器、打开外部应用、拨打电话、发送短信
  14. 检测 邮箱地址 是否存在[C#]
  15. CSS字体样式与样式效果
  16. 诗歌中的宇宙飞船和电子计算机代表什么,高考中可能出现的与神舟五号飞船有关的综合题...
  17. java并发测试工具_Java并发测试工具类
  18. linux redis命令客户端,Redis客户端与基本命令
  19. (二)OpenCV-Python学习—对比度增强
  20. linux搭建摄像头,Linux环境下配置虚拟摄像头akvcam

热门文章

  1. C#中泛型在Class上的实现
  2. Android之程序反复回调一个类的解决办法
  3. linux之学习linux系统相关的书籍
  4. Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)
  5. 活照片 android,活照片app安卓
  6. python随机抽取人名_python的random
  7. 高校教师抄袭豆瓣博主文章,学校证实:基本属实!记过并调离教学科研岗位...
  8. 男人是大猪蹄子的证据找到了!
  9. 史上最硬核的数学老师!搞发明、造大炮,让战斗民族直叫爸爸,看完我跪了......
  10. 复工后,看看他们都是怎么上班的!