【Algorithm】基数排序
一. 算法描述
- 分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)
- 收集,再将放置在0~9号桶中的数据按顺序放到数组中
- 重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位)



二. 算法实现
#include<stdio.h>
#define MAX 20
#define SHOWPASS
#define BASE 10 // 打印数组
void print(int *a, int n) {
int i;
for (i = ; i < n; i++) {
printf("%d\t", a[i]);
}
} // 基数排序
void radixsort(int *a, int n) {
int i, b[MAX], m = a[], exp = ; // 得到数组的最大值
for (i = ; i < n; i++) {
if (a[i] > m) {
m = a[i];
}
} while (m / exp > ) {
int bucket[BASE] = { }; for (i = ; i < n; i++) {
bucket[(a[i] / exp) % BASE]++;
} for (i = ; i < BASE; i++) {
bucket[i] += bucket[i - ];
} for (i = n - ; i >= ; i--) {
b[--bucket[(a[i] / exp) % BASE]] = a[i];
} for (i = ; i < n; i++) {
a[i] = b[i];
} exp *= BASE; #ifdef SHOWPASS
printf("\nPASS : ");
print(a, n);
#endif
}
} int main() {
int arr[MAX];
int i, n;
printf("请输入总元素数目 (n <= %d) : ", MAX);
scanf("%d", &n);
n = n < MAX ? n : MAX; printf("请输入 %d 个元素 : \n", n);
for (i = ; i < n; i++) {
scanf("%d", &arr[i]);
} printf("\n排序前 : ");
print(&arr[], n); radixsort(&arr[], n); printf("\n排序之后 : ");
print(&arr[], n);
printf("\n"); return ;
}
三. 算法分析
- 平均时间复杂度:O(dn)(d即表示整形的最高位数)
- 空间复杂度:O(rn) (r表示0~9,用于存储临时的序列)
- 稳定性:稳定
参考资料
[1] http://blog.csdn.net/cjf_iceking/article/details/7943609
[2] http://zh.wikipedia.org/wiki/%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F
【Algorithm】基数排序的更多相关文章
- 【HNOI 2018】寻宝游戏
Problem Description 某大学每年都会有一次 \(Mystery\ Hunt\) 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新 ...
- Algorithm in Practice - Sorting and Searching
Algorithm in Practice Author: Zhong-Liang Xiang Date: Aug. 1st, 2017 不完整, 部分排序和查询算法, 需添加. Prerequisi ...
- BZOJ.5285.[AHOI/HNOI2018]寻宝游戏(思路 按位计算 基数排序..)
BZOJ LOJ 洛谷 话说vae去年的专辑就叫寻宝游戏诶 只有我去搜Mystery Hunt和infinite corridor了吗... 同样按位考虑,假设\(m=1\). 我们要在一堆\(01\ ...
- [Algorithm] Warm-up puzzles
闲下来后,需要讲最近涉及到的算法全部整理一下,有个indice,方便记忆宫殿的查找 MIT的算法课,地球上最好:https://ocw.mit.edu/courses/electrical-engin ...
- 小白初识 - 基数排序(RadixSort)
基数排序算是桶排序和计数排序的衍生吧,因为基数排序里面会用到这两种其中一种. 基数排序针对的待排序元素是要有高低位之分的,比如单词adobe,activiti,activiti就高于adobe,这个是 ...
- 基数排序——尚未补完的坑QAQ
基数排序复杂度是(n+b)logn/logb 我们找一个基数 每次处理一部分位 从低位到高位处理 t是出现次数 s是这个桶管辖的起点 然后就可以写了 不过我这里是指针版的 有点难看 #include& ...
- 洛谷【P1177】【模板】基数排序
题目传送门:https://www.luogu.org/problemnew/show/P1177 我对计数排序的理解:https://www.cnblogs.com/AKMer/p/9649032. ...
- POJ 2388 基数排序
这题可以直接nth_element过去 比如这样子 //By SiriusRen #include <cstdio> #include <algorithm> using na ...
- [Algorithm] 面试题之犄角旮旯 第贰章
闲下来后,需要讲最近涉及到的算法全部整理一下,有个indice,方便记忆宫殿的查找 MIT的算法课,地球上最好: Design and Analysis of Algorithms 本篇需要重新整理, ...
随机推荐
- Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机显示Ip Not found
Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机用docker-machine ls 列出来的时候显示Ip Not found, 是什么原因那? [答案] 看这个帖子: ht ...
- 我不是学Java的!我不是学Java的!我不是学Java的!。。。。【自我催眠中】
我不是学Java的!我不是学Java的!我不是学Java的!....[自我催眠中]
- javascript获取和设置URL中的参数
勘误版 function getQuery(key, url) { url = url || window.location.href; if (url.indexOf('#') !== -1) ur ...
- Jaspersoft Studio 导出PDF格式中文不显示
1:设置字体 2:应用上面设置的字体
- 命令行能运行,但是在crontab不能正常运行的问题
今天配置了一个crontab,但是怎么也不能执行,原因是环境变量的问题,记录一下. 解决问题的办法,在shell脚本添加: ################## . /etc/profile . ~/ ...
- Jenkins 持续集成综合实战
Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建.测试和部署等功能.本文以 CentOS7 环境为例,总结了 Jenkin ...
- Orabbix监控Oracle 11g
Orabbix简介说明 orabbix是一个用来监控oracle数据库性能的zabbix插件工具,通过安装在被监控服务器上客户端上收集数据并传给zabbix服务器端,然后通过调用图形显示.具有以下功能 ...
- 深入理解JVM(三)——垃圾收集策略具体解释
Java虚拟机的内存模型分为五个部分.各自是:程序计数器.Java虚拟机栈.本地方法栈.堆.方法区. 这五个区域既然是存储空间,那么为了避免Java虚拟机在执行期间内存存满的情况,就必须得有一个垃圾收 ...
- urlparse基本运用
# -*- coding: cp936 -*- #python 27 #xiaodeng #urlparse基本运用 import urllib,urlparse def urlparse_test( ...
- Openwrt中用iftop查看网络流量情况
iftop可以查看指定网卡上的流量情况, 命令说明 iftop: display bandwidth usage on an interface by host Synopsis: iftop -h ...