基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法。

实现多关键字排序通常有两种作法:

 最低位优先法(LSD)

先对K[0]{基数的最低位}进行排序,并按 K(0) 的不同值将记录序列分成若干子序列之后,分别对 K[1] 进行排序,..., K[d-1]依次类推,直至最后对最次位关键字排序完成为止。

  最高位优先法(MSD)

先对 K[d-1]{基数的最高位}进行排序,然后对 K[d-2]进行排序,依次类推,直至对最主位关键字 K[0] 排序完成为止。

百度百科对基数排序做了如下介绍:

基数排序(radix sort)是属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort),顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,在某些时候,基数排序法的效率高于其它的稳定性排序法。

链式基数排序基本步骤如下

1.将待排序记录以数组存储[或者以指针相链,构成一个链表]

2.”分配”时,按当前”关键字位”所取值,将记录分配到不同的”链表/链队列”(即不同的桶或堆中)中,每条链表中记录的”关键字位”相同;

3.”收集”时,按当前关键字位取值从小到大(即将这n条链表(n的大小为基数的大小)按照编号, 依次将其中所有的元素取出)将各链表中的元素取出放入到原先的数组或链表中;

4.对每个关键字位均重复 2) 和 3) 两步n次。

如采用LSD对{179, 208, 306, 93, 859, 984, 55, 9, 271, 33}(构成一个链表或者是数组)进行基数排序:

[第一步:按个位排]

[第二步:按十位排]

[第三步:按百位排]

代码实现(以LSD为例):

//寻找数组中最大数字的位数
template <typename Type>
unsigned int maxBits(Type *begin, Type *end)
{unsigned int bits = 1;//standard作为基准, 如果array中的元素//大于standard, 则bits+1int standard = 10;for (Type *current = begin; current != end; ++current){while (*current >= standard){standard *= 10;++ bits;}}return bits;
}
/**说明:begin:数组起始end:数组结尾radix:基数*/
#define DEBUG
template <typename Type>
void radixSort(Type *begin, Type *end, int radix)
{//找到数组中最大数字的位数int bits = maxBits(begin, end);//基数为radix, 则需要radix个链表std::list<Type> lists[radix];// 需要循环bits次for (int d = 0, factor = 1; d < bits; ++d, factor*=10){//分配...for (Type *current = begin; current != end; ++current){//取出相应位置上的数 (比如个位是1)int number = ((*current)/factor)%10;//则需要将之放到(分配到)标号为1的链表中lists[number].push_back(*current);}//收集...Type *current = begin;//对radix个链表中的元素进行收集for (int i = 0; i < radix; ++i){while (!lists[i].empty()){*current = lists[i].front();++ current;lists[i].pop_front();}}
#ifdef DEBUG//打印排序的中间结果for (current = begin; current != end; ++ current){cout << *current << ' ';}cout << endl;
#endif // DEBUG}
}template <typename Type>
void radixSort(Type *array, int arraySize, int radix)
{return radixSort(array, array+arraySize, radix);
}

时间复杂度分析:

设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集.

附-测试代码:

int main()
{int array[10];for (int i = 0; i < 10; ++i){array[i] = rand()%1000;}for (int i = 0; i < 10; ++i){cout << array[i] << ' ';}cout << endl;radixSort(array, 10, 10);for (int i = 0; i < 10; ++i){cout << array[i] << ' ';}cout << endl;return 0;
}

数据结构基础(15) --基数排序相关推荐

  1. “数据结构基础”系列网络课程主页

    #前言 自从下决心要解决学生动手能力差的问题,开始了课程实践资源的建设之旅:自迷上了翻转课堂,所教课程的视频,也就逐渐形成了体系.在为我自己的校内学生服务的同时,也希望能够让更多人有机会用到. 自全身 ...

  2. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  3. 求单链表的最大值与原地逆转_数据结构基础复习09.ppt

    数据结构基础复习09.ppt 数据结构考研辅导 基础复习 浙江大学计算机学院 内容提纲 考研概述 考察目标理解数据结构的基本概念 掌握数据结构的逻辑结构 存储结构及其差异 以及各种基本操作的实现 在掌 ...

  4. 【数据分析与挖掘】数据分析学习及跟课学习 | csdn_Part 02 数据结构基础

    依旧是整理笔记的一天,纸质笔记为了简便很多东西没有完全写上,一些小练习也没跟上,再进行练习的时候好像有点问题.尽量打字熟悉吧,并且对于这方面知识可以以专业角度去深挖,不要仅限于分析的理论层面.另外数据 ...

  5. 数据结构基础:P4.2-树(二)--->二叉平衡树

    本系列文章为浙江大学陈越.何钦铭数据结构学习笔记,前面的系列文章链接如下: 数据结构基础:P1-基本概念 数据结构基础:P2.1-线性结构->线性表 数据结构基础:P2.2-线性结构->堆 ...

  6. C语言数据结构-第一讲-数据结构基础概念-电大

    第一讲数据结构基础概念内容简介 数据是表征客观事物的可记录可识别的符号集合.数据是信息处理的核心基础. 本讲主要介绍了与数据结构有关的基本概念术语: l       数据 l       数据元素 l ...

  7. 【数据结构基础】之数组介绍,生动形象,通俗易懂,算法入门必看

    前言 本文为数据结构基础数组相关知识,下边将对数组的定义.性质及结构,数组的各种玩法如循环遍历数组.查找数组最大值.数组元素的位移等,二维数组的定义及用法等进行详尽介绍~ Java全栈学习路线可参考: ...

  8. 考研数据结构の基础概念

    考研数据结构の基础概念 第一章 绪论 第二章 线性表 第三章 栈与队列 第四章 串 第五章 矩阵与广义表 第六章 树 第七章 图 第八章 排序 第九章 查找 第一章 绪论 1.数据:是对客观事物的符号 ...

  9. 计算机网络系统中每台计算机的地位是什么,东北师范计算机应用基础15秋在线作业1满分答案...

    东北师范计算机应用基础15秋在线作业1满分答案 一.单选题 1. 计算机网络按其所涉及范围的大小和计算机之间互联距离的不同,其类型可分 为____. A. 局域网.广域网和万维网 B. 局域网.广域网 ...

最新文章

  1. linux的platform驱动
  2. nginx php post限制,叫你如何修改Nginx与PHP的文件上传大小限制
  3. 招人信息,请斟酌后联系偶!
  4. vuecli 实战商城后台管理系统_前台商城系统及后台管理系统
  5. Java黑皮书课后题第6章:*6.16(一年的天数)使用下面的方法体编写一个方法,返回一年的天数。编写一个测试程序,显示从2000年到2020年间每年的天数
  6. 【转】Linux如何在系统启动时自动加载模块
  7. 两个链接合并_如何找到两个链接列表的合并点
  8. Python中的运算符是什么?本文详解!
  9. 【java笔记】File类(2):获取,判断,创建,删除,遍历目录方法
  10. 2017蓝桥杯C++B:日期问题(日期转字符串)
  11. GridView跨页面多选
  12. visio流程图的叉号_笔记软件、思维导图软件和流程图软件, mybase, mindmanager, mindmapper,visio...
  13. 腾达无线路由器怎么建立服务器,如何在腾达建立无线路由器 | 192.168.1.1手机登陆...
  14. 穷举(一):穷举法的基本思想
  15. The simplest Singleton
  16. 如何渡过小白期,不再当菜鸟程序员?
  17. C# 读取或修改文件后缀
  18. crawlergo带cookie爬虫
  19. 中国国内驾照在韩国换驾照的经过
  20. js根据一个时间计算N年后的时间-计算时间demo示例

热门文章

  1. 基础编程题之最大连续bit数(位运算)
  2. 从零开始学PowerShell(4)数据的选择、排序与格式化
  3. emp3r0r - Linux下的进程注入和持久化(初级)
  4. Python twisted框架使用解析
  5. ROS(kinetic)报错:CMakeFiles/Makefile2:9038: recipe for target ‘XXX‘
  6. 机器学习 | 算法笔记- 集成学习(Ensemble Learning)
  7. 函数、迭代器、生成器、装饰器
  8. PAT 1017 Queueing at Bank[一般]
  9. 我30岁了。现在开始编程,会不会太晚?
  10. 如何保证消息队列里的数据顺序执行?