【每日算法】基数排序算法
1)算法简介
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。
2)算法描述和分析
整个算法过程描述如下:
1、将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
2、从最低位开始,依次进行一次排序。
3、这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
基数排序的时间复杂度是 O(k•n),其中n是排序元素个数,k是数字位数。
注意这不是说这个时间复杂度一定优于O(n·log(n)),因为k的大小一般会受到n的影响。 以排序n个不同整数来举例,假定这些整数以B为底,这样每位数都有B个不同的数字,k就一定不小于logB(n)。由于有B个不同的数字,所以就需要B个不同的桶,在每一轮比较的时候都需要平均n·log2(B) 次比较来把整数放到合适的桶中去,所以就有:k 大于或等于 logB(n)
每一轮(平均)需要 n·log2(B) 次比较
所以,基数排序的平均时间T就是:
T ≥ logB(n)·n·log2(B) = log2(n)·logB(2)·n·log2(B) = log2(n)·n·logB(2)·log2(B) = n·log2(n)
所以和比较排序相似,基数排序需要的比较次数:T ≥ n·log2(n)。 故其时间复杂度为 Ω(n·log2(n)) = Ω(n·log n) 。
3)算法图解、flash演示、视频演示
图解:
Flash:
可参见http://ds.fzu.edu.cn/fine/resources/FlashContent.asp?id=91中的flash过程
视频:
http://www.tudou.com/programs/view/vfoUHC-tgi0
4)算法代码
#include <stdio.h>
#include <stdlib.h>
void radixSort(int data[]) { int temp[10][10] = {0}; int order[10] = {0}; int n = 1; while(n <= 10) { int i; for(i = 0; i < 10; i++) { int lsd = ((data[i] / n) % 10); temp[lsd][order[lsd]] = data[i]; order[lsd]++; } // 重新排列 int k = 0; for(i = 0; i < 10; i++) { if(order[i] != 0) { int j; for(j = 0; j < order[i]; j++, k++) { data[k] = temp[i][j]; } } order[i] = 0; } n *= 10; }
}
int main(void) { int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81}; printf("\n排序前: "); int i; for(i = 0; i < 10; i++) printf("%d ", data[i]); putchar('\n'); radixSort(data); printf("\n排序後: "); for(i = 0; i < 10; i++) printf("%d ", data[i]); return 0;
}
5)考察点、重点和频度分析
计数排序在处理密集整数排序的问题的时候非常有限,尤其是有时候题目对空间并不做太大限制,那使用计数排序能够达到O(n)的时间复杂度,远快于所有基于比较的其他排序方法。
转载于:https://www.cnblogs.com/shih/p/6660246.html
【每日算法】基数排序算法相关推荐
- 基数排序算法(基于Java实现)
title: 基数排序算法(基于Java实现) tags: 基数算法 基数排序算法原理及代码实现: 一.基数排序算法的原理 基数排序属于"分配式排序",又称"桶子法&qu ...
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-归并排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-冒泡排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 基数排序算法LSD实现
基数排序算法的实质是用的分类的方式. LSD 按低位开始分类, 其实在按各位进行分类的时候就已经注定了 相同位数的数的相对大小关系了. lsd实现如下: #include <iostream&g ...
- 【算法知识】详解基数排序算法
已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 [算法知识]详解归并排序算法 基本思想 基数排序的思想是将整数按位数切 ...
- JavaScript实现RadixSort基数排序算法(附完整源码)
JavaScript实现RadixSort基数排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 RadixSort.js完整源代码 Comparator.js完整 ...
- 经典排序算法(10)——基数排序算法详解
基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 一.算法基本思想 (1)基本思想 基数排序是基于桶排序来实现.通过键值的部分 ...
- java 线性的排序算法_数据结构之排序算法Java实现(9)—— 线性排序之 基数排序算法...
基数排序算法是计数排序的延伸,计数排序会造成很大的空间浪费,但基数排序法是对位数进行排序,适合于位数之间相差较大的情况,废话不多说,直接上代码: 升序排序法: /** * 基数排序法 * 升序排列 * ...
- c++ 基数排序算法_基数排序算法– C / C ++实现的基础
c++ 基数排序算法 Radix Sort Algorithm is a unique sorting algorithm that works on the basic principle of n ...
最新文章
- 如何使用 Druid 和 Kafka 构造 Kappa 架构完成流量分析
- linux i2c ioctl错误,关于读写I2C总线的时候出错的有关问题
- SharedPreferences的使用
- 从菜鸟到老鸟--Mac篇 [五]
- AOM Summit 来了
- 什么是RPA 现在都有哪些产品
- LeetCode 875. 爱吃香蕉的珂珂(二分查找)
- 创建unique时,约束和索引有何区别。唯一约束和唯一索引区别,选项忽略重复键作用
- 认识队列技术中的硬件队列和软件队列及如何改变硬件队列长度
- SpringMvc的 @Valid 拦截到的异常如何抛出
- windows CMD 下 长ping 加时间戳,亲测有效
- 海康威视网络摄像头Demo示例研究
- 侯晓迪:全身心的投入,吃住都在实验室
- shell+curl+fortune+pushplus–>每日一言
- 【Android】使用后端云Bmob实现登录、注册
- 两万文字多图详解常用软件工具使用(持续更新)
- java笔迹比对_[笔迹]java-其他
- 基于微信小程序的校园二手物品交易平台的设计与实现-计算机毕业设计源码+LW文档
- PyCharm运行按钮是灰色的
- linux 传输文件stpf,在Linux下搭建 miniGUI mStudio环境...-linux 全面剖析ps命令-纯Servlet实现文件上传_169IT.COM...
热门文章
- git使用---工作区和暂存区
- Makefile学习(二)[第二版]
- 数据库之间数据转换最快方法
- sencha touch 手势识别左右滑动
- Java -- 网络编程(一):Client与Server之间的数据传送
- 如何实现从wgs-84到beijing54的坐标转换
- vue项目配置eslint(附visio studio code配置)
- freemarker常见语法大全
- PYPL 4 月排行:Python 最流行,Java 还行不行?
- Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...