排序算法之九 基数排序(C++版本)
一. 实现原理
基数排序的相关知识,参考漫画:什么是基数排序?
二. 具体实现
实现中,使用vector作为桶,只是从编码便利的角度出发。
辅助函数
// 获取data的位数
int GetBitCount(int data)
{int curCount = 0;while (data != 0){++curCount;data = data / 10;}return curCount;
}
// 获取某个数的某一位的值,certainBit 1表示个位,2表示十位,依次类推
int GetDataInBit(int data, int certainBit)
{int remainder = 0;while (certainBit-- != 0){remainder = data % 10;data = data / 10;}return remainder;
}
// 获取数组中元素的最大位数
int GetMaxBitCount(int* pData, int size)
{int maxBitCount = 0;for (int idx = 0; idx < size; ++idx){int curBitCount = GetBitCount(pData[idx]);if (curBitCount > maxBitCount) maxBitCount = curBitCount;}return maxBitCount;
}
最终实现
void RadixSort(int* pData, int size)
{if (nullptr == pData || size < 1) return;std::vector<std::vector<int>> tempTables(10); // 总共10个桶for (int curBit = 1; curBit <= GetMaxBitCount(pData, size); ++curBit) // 从最低为1到最高位maxBitCount{for (int idx = 0; idx < size; ++idx)// 将各个元素根据当前位的数字分到各个桶{int curData = GetDataInBit(pData[idx], curBit);tempTables[curData].push_back(pData[idx]);}int curIdx = 0; // 将桶中元素写回到原数组for (auto& curTable : tempTables){for (int curData : curTable) pData[curIdx++] = curData;curTable.clear(); // 清空vector}}
}
三. 输出验证
加上相关的输出信息后再进行调用。
辅助函数
void Print(int* pData, int size)
{for (int idx = 0; idx < size; ++idx) std::cout << pData[idx] << " ";std::cout << std::endl;
}
初始数据为
int datas[30] = { 41 167 34 100 269 124 78 258 262 164 5 245 181 27 61 191 295 242 27 36 291 204 2 153 292 82 21 116 218 95 };
输出版本
void RadixSort_Output(int* pData, int size)
{if (nullptr == pData || size < 1) return;std::vector<std::vector<int>> tempTables(10); // 总共10个桶int maxBitCount = GetMaxBitCount(pData, size);for (int curBit = 1; curBit <= maxBitCount; ++curBit) // 从最低为1到最高位maxBitCount{for (int idx = 0; idx < size; ++idx)// 将各个元素根据当前位的数字分到各个桶{int curData = GetDataInBit(pData[idx], curBit);tempTables[curData].push_back(pData[idx]);}std::cout << std::endl << "CUR BIT " << curBit << std::endl;for (int idx = 0; idx < (int)tempTables.size(); ++idx){auto& curTable = tempTables[idx];std::cout << std::endl << "BUCKET " << idx << std::endl;Print(curTable.data(), (int)curTable.size());}int curIdx = 0; // 将桶中元素写回到原数组for (auto& curTable : tempTables){for (int curData : curTable) pData[curIdx++] = curData;curTable.clear();}std::cout << "WRITE BACK " << std::endl;Print(pData, size);}
}
调用输出
INIT DATA // 初始数据
41 167 34 100 269 124 78 258 262 164 5 245 181 27 61 191 295 242 27 36 291 204 2 153 292 82 21 116 218 95CUR BIT 1 // 开始按个个位进行分桶BUCKET 0 // 0号桶
100BUCKET 1 // 1号桶
41 181 61 191 291 21BUCKET 2 // 2号桶
262 242 2 292 82BUCKET 3 // 3号桶
153BUCKET 4 // 4号桶
34 124 164 204BUCKET 5 // 5号桶
5 245 295 95BUCKET 6 // 6号桶
36 116BUCKET 7 // 7号桶
167 27 27BUCKET 8 // 8号桶
78 258 218BUCKET 9 // 9号桶
269WRITE BACK // 将桶中元素写回到远数组
100 41 181 61 191 291 21 262 242 2 292 82 153 34 124 164 204 5 245 295 95 36 116 167 27 27 78 258 218 269CUR BIT 2 // 开始按十位进行分桶BUCKET 0
100 2 204 5BUCKET 1
116 218BUCKET 2
21 124 27 27BUCKET 3
34 36BUCKET 4
41 242 245BUCKET 5
153 258BUCKET 6
61 262 164 167 269BUCKET 7
78BUCKET 8
181 82BUCKET 9
191 291 292 295 95WRITE BACK
100 2 204 5 116 218 21 124 27 27 34 36 41 242 245 153 258 61 262 164 167 269 78 181 82 191 291 292 295 95CUR BIT 3 // 开始按百位进行分桶BUCKET 0
2 5 21 27 27 34 36 41 61 78 82 95BUCKET 1
100 116 124 153 164 167 181 191BUCKET 2
204 218 242 245 258 262 269 291 292 295BUCKET 3BUCKET 4BUCKET 5BUCKET 6BUCKET 7BUCKET 8BUCKET 9WRITE BACK
2 5 21 27 27 34 36 41 61 78 82 95 100 116 124 153 164 167 181 191 204 218 242 245 258 262 269 291 292 295FINAL DATA // 最终数据
2 5 21 27 27 34 36 41 61 78 82 95 100 116 124 153 164 167 181 191 204 218 242 245 258 262 269 291 292 295
排序算法之九 基数排序(C++版本)相关推荐
- js排序算法详解-基数排序
全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-基数排序 其实基数排序和桶排序挺类似的,都是找一个容器把属于同一类的元素装起来,然后进行排序.可以把基数排序类 ...
- 排序算法10——图解基数排序(次位优先法LSD和主位优先法MSD)
排序算法1--图解冒泡排序及其实现(三种方法,基于模板及函数指针) 排序算法2--图解简单选择排序及其实现 排序算法3--图解直接插入排序以及折半(二分)插入排序及其实现 排序算法4--图解希尔排序及 ...
- C++实现桶排序——十大经典排序算法之九【GIF动画+完整代码+详细注释】
十大经典排序算法系列博客-->传送门 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均 ...
- 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...
- 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid
转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...
- 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid
三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...
- Java实现排序算法
一.常见排序算法: 1.插入类排序: (1)直接插入排序 (2)希尔排序 2.选择类排序 (1)简单选择排序 (2)堆排序 3.交换类排序 (1)冒泡排序 (2)快速排序 4.归并排序 5.基数排序 ...
- Python 实现十大经典排序算法
目录 排序算法分类 一.冒泡排序(Bubble Sort) 1.原理 2.步骤 3.动画演示 4.代码实现 5.具体示例 二.选择排序(Selection Sort) 1.原理 2.步骤 3.动画演示 ...
- 超全十大经典排序算法及其分析
文章目录 0.算法概述 0.1 算法分类 0.2 算法复杂度 0.3 相关概念 1. 冒泡排序(Bubble Sort) 1.1 算法描述: 1.2 图解演示 1.3 代码实现 1.4 优化过程 1. ...
- 动画 | 大学四年结束之前必须透彻的排序算法
现如今大学生学习排序算法,除了学习它的算法原理.代码实现之外,作为一个大学生更重要的往往是要学会如何评价.分析一个排序算法.排序对于任何一个程序员来说,可能都不会陌生.大部分编程语言中,也都提供了排序 ...
最新文章
- 网络排错模型之我见----模型,基线,协议,数据包
- Java实现心跳机制
- java 重置定时器_可重置Java定时器
- 30天打造专业红客七
- 开学季|计算机专业的你看过来!
- [HTML5 Canvas学习]绘制矩形
- Windows forfiles(删除历史文件)
- Newtonsoft 反序列化字符串
- nodejs pm2教程(转载)
- CentOS 通过yum来升级php到php5.6
- ubuntu启动virtualbox出错解决办法:RTR3InitEx failed with rc=-1912 (rc=-1912)
- 翻译:机器学习 数据科学家 top 10 十大算法
- mouseenter 事件
- ADX趋势线突破交易系统
- android常用字体代码,Android TextView设置字体风格多种组合
- 新词发现-helloNLP
- 拍照识别植物app哪个好?来看看这几个工具
- 【转】BCWS、BCWP、ACWP的理解
- CLIP(Learning Transferable Visual Models From Natural Language Supervision)
- 读书笔记014:《伤寒论》- 足厥阴肝经