一. 实现原理

基数排序的相关知识,参考漫画:什么是基数排序?

二. 具体实现

实现中,使用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++版本)相关推荐

  1. js排序算法详解-基数排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-基数排序 其实基数排序和桶排序挺类似的,都是找一个容器把属于同一类的元素装起来,然后进行排序.可以把基数排序类 ...

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

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

  3. C++实现桶排序——十大经典排序算法之九【GIF动画+完整代码+详细注释】

    十大经典排序算法系列博客-->传送门 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均 ...

  4. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...

  5. 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid

    转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...

  6. 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid

    三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...

  7. Java实现排序算法

    一.常见排序算法: 1.插入类排序: (1)直接插入排序 (2)希尔排序 2.选择类排序 (1)简单选择排序 (2)堆排序 3.交换类排序 (1)冒泡排序 (2)快速排序 4.归并排序 5.基数排序 ...

  8. Python 实现十大经典排序算法

    目录 排序算法分类 一.冒泡排序(Bubble Sort) 1.原理 2.步骤 3.动画演示 4.代码实现 5.具体示例 二.选择排序(Selection Sort) 1.原理 2.步骤 3.动画演示 ...

  9. 超全十大经典排序算法及其分析

    文章目录 0.算法概述 0.1 算法分类 0.2 算法复杂度 0.3 相关概念 1. 冒泡排序(Bubble Sort) 1.1 算法描述: 1.2 图解演示 1.3 代码实现 1.4 优化过程 1. ...

  10. 动画 | 大学四年结束之前必须透彻的排序算法

    现如今大学生学习排序算法,除了学习它的算法原理.代码实现之外,作为一个大学生更重要的往往是要学会如何评价.分析一个排序算法.排序对于任何一个程序员来说,可能都不会陌生.大部分编程语言中,也都提供了排序 ...

最新文章

  1. 网络排错模型之我见----模型,基线,协议,数据包
  2. Java实现心跳机制
  3. java 重置定时器_可重置Java定时器
  4. 30天打造专业红客七
  5. 开学季|计算机专业的你看过来!
  6. [HTML5 Canvas学习]绘制矩形
  7. Windows forfiles(删除历史文件)
  8. Newtonsoft 反序列化字符串
  9. nodejs pm2教程(转载)
  10. CentOS 通过yum来升级php到php5.6
  11. ubuntu启动virtualbox出错解决办法:RTR3InitEx failed with rc=-1912 (rc=-1912)
  12. 翻译:机器学习 数据科学家 top 10 十大算法
  13. mouseenter 事件
  14. ADX趋势线突破交易系统
  15. android常用字体代码,Android TextView设置字体风格多种组合
  16. 新词发现-helloNLP
  17. 拍照识别植物app哪个好?来看看这几个工具
  18. 【转】BCWS、BCWP、ACWP的理解
  19. CLIP(Learning Transferable Visual Models From Natural Language Supervision)
  20. 读书笔记014:《伤寒论》- 足厥阴肝经

热门文章

  1. mysql 基本命令整理(1)
  2. 项目管理之我见:程序开发步骤
  3. Android书籍翻页效果需要用到的文件
  4. /etc/mtab is not writable
  5. 沈熙-JavaScript引擎原理及优化
  6. 老上网本不能上无线网
  7. ESXI NUMA node 1 has no memory..
  8. Qt 使用vs调试的方法
  9. 7.PHP核心技术与最佳实践 --- PHP 扩展开发
  10. 5. Zend_Log