基数排序
来源:互联网 发布:佛罗里达大学 知乎 编辑:程序博客网 时间:2024/06/04 19:22
基数排序是一种“非比较排序算法”,什么叫非比较排序算法呢,就是在实施排序的过程中,没有直接的比较元素之间的大小。其复杂度和被排序个数呈线性关系,原理是利用从小到大依次基于更小的已经排序的位的每一个十进制位进行排序,最后得到排序后的结果(具体证明和过程请参考MIT 的《算法导论》书籍)。下面用c++代码演示一个处理正整形数的基数排序,如果要处理负数需要做一些特殊的改进。栗子如下:
#include <iostream>#include <vector>#include <list>using namespace std;int getBase(unsigned int num, int base) { while(base > 0) { num = num/10; base--; } int ret = num%10; return ret;}void baseSort(unsigned int arr[], int from, int to, int baseNum) { vector<vector< list<unsigned int> > > baseVec(baseNum); for(int i = 0; i < baseNum; i++) { baseVec[i].resize(10); } for(int i = from; i <= to; i++) { baseVec[0][getBase(arr[i], 0)].push_back(arr[i]); } for(int i = 1; i < baseNum; i++) { for(int j = 0; j < 10; j++) { for(item : baseVec[i - 1][j]) { baseVec[i][getBase(item, i)].push_back(item); } } } int pos = from; for(topBase : baseVec[baseNum - 1]) { for(item : topBase) { arr[pos] = item; pos++; } }}int main() { unsigned int arr[] = {22, 55, 11, 66, 444, 3323233, 123456789, 1234, 12345, 0, 1222, 44, 55, 44, 22, 111, 19898, 123456789, 3323233}; baseSort(arr, 0, sizeof(arr)/sizeof(arr[0]) - 1, 9); for(item : arr) { cout<<item<<" "; } cout<<endl; return 0;}
阅读全文
0 0
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- [活动]微信小程序悬赏通缉令——你晒程序我送礼
- noi2014动物园解题报告
- 单、多行文本溢出
- js 的动态获取与插入,卡死浏览
- 资源池 'default' 没有足够的系统内存来运行此查询
- 基数排序
- oracle,把多列同时转成用逗号分割的一行,并去除重复数据
- 关于端口做过映射导致nginx自动添加内网端口的问题
- 学习笔记之面向对象编程6(equals)
- CentOS7环境下Jenkins的安装
- HDU 4911 Inversion(归并排序求逆序对)
- java集合关系继承图
- MySQL导入大批Excel数据
- C/C++ 练习题