一. 算法描述

  基数排序(以整形为例),将整形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. POJ 3009:Curling 2.0 推箱子

    Curling 2.0 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14090   Accepted: 5887 Desc ...

  2. Python爬虫学习系列教程

    最近想学一下Python爬虫与检索相关的知识,在网上看到这个教程,觉得挺不错的,分享给大家. 来源:http://cuiqingcai.com/1052.html 一.Python入门 1. Pyth ...

  3. 其原因可能是堆被损坏,这也说明 xxx.exe 中或它所加载的任何 DLL 中有 bug

    1.代码如下: string src ="abcdabcd"; char* dst = new char[8]; strcpy(dst,src.c_str()); delete[] ...

  4. c++ 11 游记 之 decltype constexpr

    title: c++ 11 游记 1 keyword :c++ 11 decltype constexpr 作者:titer1 zhangyu 出处:www.drysaltery.com 联系:130 ...

  5. 自然语言处理哪家强?【36kr】

    语音交互事关未来,国内外已经不少公司在抢蛋糕了,大公司收购.投资.合作不断,就可见一斑.目前,基本上所有的巨头都有涉足. 苹果收购 Siri.Novauris,组建基于神经网络算法的语音识别团队 20 ...

  6. 详解使用DockerHub官方的mysql镜像生成容器

    详解使用DockerHub官方的mysql镜像生成容器 收藏 yope 发表于 10个月前 阅读 1506 收藏 32 点赞 1 评论 0 腾讯云·云上实验室:开发者零门槛,免费使用真机在线实验!&g ...

  7. 牛客网-《剑指offer》-替换空格

    题目:http://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423 C++ class Solution { public: vo ...

  8. 微信小程序 - 深度定义骨架屏(提示)

    此举每个页面必须创建对应的css样式,比较麻烦(但非常准确),推荐使用组件化的skeleton组件 原理很简单:知晓一下this.setData原理,就OK了,可能大家会因此了解到全屏加载loadin ...

  9. Visual SVN的安装

    作为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行有效的管理.今天我就介绍一个在Windows环境下简单快速搭建SVN服务器的方法. 通常的SVN服务器是搭 ...

  10. jump-game i&&ii 能否跳出区间 贪心

    I: Given an array of non-negative integers, you are initially positioned at the first index of the a ...