一. 算法描述

  基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为三个过程:
  1. 分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)
  2. 收集,再将放置在0~9号桶中的数据按顺序放到数组中
  3. 重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位)
  下面以【521 310 72 373 15 546 385 856 187 147】序列为例,具体细节如下图所示:

二. 算法实现

#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

  [3] http://baike.baidu.com/view/1617233.htm?fr=aladdin

【Algorithm】基数排序的更多相关文章

  1. 【HNOI 2018】寻宝游戏

    Problem Description 某大学每年都会有一次 \(Mystery\ Hunt\) 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新 ...

  2. Algorithm in Practice - Sorting and Searching

    Algorithm in Practice Author: Zhong-Liang Xiang Date: Aug. 1st, 2017 不完整, 部分排序和查询算法, 需添加. Prerequisi ...

  3. BZOJ.5285.[AHOI/HNOI2018]寻宝游戏(思路 按位计算 基数排序..)

    BZOJ LOJ 洛谷 话说vae去年的专辑就叫寻宝游戏诶 只有我去搜Mystery Hunt和infinite corridor了吗... 同样按位考虑,假设\(m=1\). 我们要在一堆\(01\ ...

  4. [Algorithm] Warm-up puzzles

    闲下来后,需要讲最近涉及到的算法全部整理一下,有个indice,方便记忆宫殿的查找 MIT的算法课,地球上最好:https://ocw.mit.edu/courses/electrical-engin ...

  5. 小白初识 - 基数排序(RadixSort)

    基数排序算是桶排序和计数排序的衍生吧,因为基数排序里面会用到这两种其中一种. 基数排序针对的待排序元素是要有高低位之分的,比如单词adobe,activiti,activiti就高于adobe,这个是 ...

  6. 基数排序——尚未补完的坑QAQ

    基数排序复杂度是(n+b)logn/logb 我们找一个基数 每次处理一部分位 从低位到高位处理 t是出现次数 s是这个桶管辖的起点 然后就可以写了 不过我这里是指针版的 有点难看 #include& ...

  7. 洛谷【P1177】【模板】基数排序

    题目传送门:https://www.luogu.org/problemnew/show/P1177 我对计数排序的理解:https://www.cnblogs.com/AKMer/p/9649032. ...

  8. POJ 2388 基数排序

    这题可以直接nth_element过去 比如这样子 //By SiriusRen #include <cstdio> #include <algorithm> using na ...

  9. [Algorithm] 面试题之犄角旮旯 第贰章

    闲下来后,需要讲最近涉及到的算法全部整理一下,有个indice,方便记忆宫殿的查找 MIT的算法课,地球上最好: Design and Analysis of Algorithms 本篇需要重新整理, ...

随机推荐

  1. 解决webstom failed to change read-only files

    我百思不得其解的是,为何我的文件不让我更改,变成了只读模式,后来我仔细回忆了一下,原来是因为我使用了root权限,来安装thinkjs之后,webstom没有root权限,所以我使用root,在终端敲 ...

  2. 在Excel中输入超过10的带圈数字

    通过改变字体,可以在excel中输入1-20的带圈数字.对于某些人这些还不够用,那怎么办呢? 有了下面这个不知道是哪个大神做的字体,你就可以直接输到100啦 将字体文件文件粘贴至“C:\WINDOWS ...

  3. ASP入门(十五)- Global.asa

    Global.asa 文件是一个可选文件,它可包含被 ASP 应用程序中每个页面访问的对象.变量和方法的声明.所有合法的浏览器脚本都可以在 Global.asa 中使用. Global.asa 文件只 ...

  4. Python爬虫实战(二):爬百度贴吧

    代码: # _*_ coding:utf-8 _*_ import urllib import urllib2 import re class Tool: removingImg = re.compi ...

  5. Oracle——数据库启动与关闭

    本文内容 服务器环境 客户端环境 概述 启动数据库 关闭数据库 补充 参考资料 本文说明 Oracle 数据库的启动和关闭,内容虽然基础,但是在数据库很多操作中都需要,因此,基础而重要,必须深入理解. ...

  6. css规范 - bem

    用我的话简述来说,即 B:何种元素 E:何种模块使用它(header,footer)等 M:描述它是做何种事情的 例如就是我有个主页,名称是:index.html index_header_logo ...

  7. TQ2440与西门子S7-200 PLC自由口通信实现过程中问题总结

    1.在win7上安装好PLC编程软件 STEP 7 MicroWIN 之后,无法实现编程软件与PLC的通信连接? 原因:STEP 7 MicroWIN 对win7支持不是很好 解决办法:在win7中安 ...

  8. http-server使用

    https://segmentfault.com/q/1010000003926981

  9. XML的四种解析方法

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6646572.html  XML文档以层级标签的形式来组织数据,多用于配置文件.存储静态数据.交换数据.     ...

  10. JqGrid把数据行插入指定位置的方法addRowData

    1.首页在colModel里写好方法,如下代码options.rowId是获取当前行的编号 { label: '操作', width: 60, align: 'center', formatter: ...