基数排序
来源:互联网 发布:擦枪字幕组怎么样知乎 编辑:程序博客网 时间:2024/05/16 08:39
基数排序指的是先将个位数排序,然后再按十位数排序.....依次往后,当排到最大位的时候排序结束
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;const int maxn = 10;int m, n, MAX, MAX_NUM;int a[50] = {0};int getnum(int x, int pos) // 获得第pos位的数{ int t = 1; for(int i = 0; i < pos - 1; ++i) t *= 10; return (x / t) % 10;}void radix_sort(){ int *arr[maxn]; //辅助数组 for(int i = 0; i < maxn; ++i) { arr[i] = (int *)malloc(sizeof(int) * (n + 1)); memset(arr[i], 0, sizeof(arr)); } for(int pos = 1; pos <= MAX_NUM + 1; ++pos) { for(int i = 0; i < n; ++i) { int num = getnum(a[i], pos); int id = ++arr[num][0]; // arr[num][0]存的是现在位数为num的数的个数 arr[num][id] = a[i]; } for(int i = 0, j = 0; i < maxn; ++i) { for(int k = 1; k <= arr[i][0]; ++k) a[j++] = arr[i][k]; //从桶中取回 arr[i][0] = 0; } //memset(arr, 0, sizeof(arr)); 这个是错的。。用了会RE,不知道为啥。。 } return ;}int main() { scanf("%d", &n); MAX = -1; for(int i = 0; i < n; ++i) { scanf("%d", &a[i]); if(a[i] > MAX) MAX = a[i]; } MAX_NUM = 0; while(MAX != 0) { MAX /= 10; ++MAX_NUM; //最大值的位数 } radix_sort(); for(int i = 0; i < n; ++i) printf("%d ", a[i]); printf("\n"); return 0;}
0 0
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 基数排序
- 使用ssh private key 免密码登陆服务器的流程(Amazon 的EMR 采用了此方式登陆服务器)
- asp.net 获取客户端真实Ip
- 进程信息和调试
- win7与VM的linux共享文件
- Activity的生命周期
- 基数排序
- ggplot2 实例-时间序列图(图层概念,图例修改)
- 【翻译】PHP7——新特性
- Nutch 查看抓取的文件
- ExDate Oracle 数据库优化的原则和方法
- Construct Binary Tree from Preorder and Inorder Traversal
- C语言单链表逆序
- android studio生成签名apk后在手机上安装不了
- jqery和js如何判断checkbox是否选中