时间复杂度为O(n)的计数排序算法
凡是学过数据结构的朋友们大多熟悉一些排序算法,插入排序、冒泡排序、快速排序、和堆排序等。这些排序总的来说都是于比较排序算法,也就是说要对容器中的数据进行大小的比较。在这里合并排序和堆排序都采用了算法中经常使用的一种策略,分而治之来提高效率。他们都属于渐进最优的比较排序算法,时间复杂度达到了O(nlgn),很优秀了,不是么?这里不再唠叨那些比较常见的排序算法,在接下来的几天,我给大家介绍分别介绍计数排序、基数排序和桶排序。
我们所要排序的数据往往是有一定规律的,甚至我们可以对排序数据做某种假设,告诉他们,我的代码在什么什么情况下使用的效率是多么多么的出色。正所谓没有万能的理论,没有万能的代码。计数排序假设输入数据是由一个小范围的数据构成,而且我们利用空间换取了时间。看个例子吧。
{
if(len < 2 || !ret || !A)
{
return;
}
int Temp[256];
for(int i = 0; i < 256; i++)
{
Temp[i] = 0;
}
for(int i = 0; i<len; i++)
{
Temp[int(A[i])]++;
}
for(int i = 1; i<256;i++)
{
Temp[i]=Temp[i]+Temp[i-1];
}
for(int i = len-1; i >= 0 ; i--)
{
(*ret)[Temp[int(A[i])]-1] = A[i];
Temp[int(A[i])]--;
}
}
上面代码是计数排序的一个简单实现,是对字符以ASCII码值的大小进行排序。所以作者要在排序过程中申请一个256整型大小的临时空间,这是用来存储ASCII码为n的字符前面有多少个字符的临时变量。
代码是比较容易看懂的,该算法的基本思想就是对于每个输入数据x,确定出小于他的元素的个数,有了这个就可以把x放到最终输出的位置了。最后要说的是,计数排序可是个时间复杂度为O(n)的稳定排序啊。
转载于:https://www.cnblogs.com/BruceZhao/archive/2007/12/16/996846.html
时间复杂度为O(n)的计数排序算法相关推荐
- 经典排序算法(11)——计数排序算法详解
计数排序(Counting sort)是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k ...
- c ++递归算法数的计数_计数排序算法–在C / C ++中实现的想法
c ++递归算法数的计数 What is the counting sort algorithm? In Computer Science, sorting algorithms form the b ...
- 理解计数排序算法的原理和实现
计数排序(Counting sort)是一种稳定的线性时间排序算法,其平均时间复杂度和空间复杂度为O(n+k),其中n为数组元素的个数,k为待排序数组里面的最大值.同样具有线性时间排序的算法还有桶排序 ...
- JavaScript实现CountingSort计数排序算法(附完整源码)
JavaScript实现CountingSort计数排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 CountingSort.js完整源代码 Comparato ...
- 使其正序排序 打印一串数字_JavaScript计数排序算法
一.计数排序算法 计数排序(Counting sort)是一种稳定的线性时间排序算法.该算法于1954年由 Harold H. Seward 提出.计数排序使用一个额外的数组,数组的下标对应待排序的数 ...
- 计数排序:时间复杂度仅为 O(n) 的排序算法
一.简介 计算排序假设 n 个输入元素都是 0 到 k 区间内的一个整数,其中 k 为某个整数. 基本原理: 创建一个长度为 k+1 的数组 count[],它的 count[i] 的值对应输入数组中 ...
- 计数排序算法——C++
计数排序是时间复杂度为 O(n)的算法,空间复杂度为O(n):算法思想跟散列表哈希hash有些类似,主要是利用一段有序数组计算对应元素的下表个数,然后依次输出有数组元素进行排列.基本计数排序是不稳定算 ...
- c++之计数排序算法
1.计数排序 计数排序(Counting sort) 是一种稳定的排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的 ...
- php常用算法的时间复杂度,php的几个经典排序算法及时间复杂度和耗时
$arr = []; for ($i=0; $i 测试结果:排序用时(秒):5.2821290493011 php排序里的经典算法首先想到的就是冒泡排序法, 排序思想:两两交换小数上浮大数下沉每轮浮出 ...
- 基础算法-2: 时间复杂度为O(N*logN)的排序算法
时间复杂度 O(N*logN): 归并排序,堆排序(大根堆,小根堆,heapInsert/heapify),快速排序(荷兰国旗问题). 归并排序 L - Mid - R 先让 左有序,右有序. 归并 ...
最新文章
- android studio apt作用,解决Android studio 3.0 apt插件问题
- 未能找出类型或命名空间名称“T” 问题的解决方案
- 从编译原理看一个解释器的实现
- 关于量子计算机 (3)
- 聊聊Synchronized
- 假如有人把支付宝所有存储服务器炸了,我们在里边的钱是不是都丢了?
- jQuery Dom 操作,动态生成dom,绑定事件
- android 读取excel数据并保存为xml文件
- 《iOS创意程序设计家》——第6.2节导航栏控制器UINavigationController
- 标准STUN判断NAT类型的过程及改进
- jzoj3501-消息传递【换根法,树形dp】
- php点击后增加html元素,如何动态生成html元素以及为元素追加属性的方法介绍(附代码)...
- 3-3HDFS中文件的读写操作
- 视觉SLAM笔记(58) 字典
- autowired注入jar中的依赖_springboot项目中调用jar包中的类时报错 — 没有注入类
- 测试之法 —— mock object
- ASP.NET C# 实现钉钉签名算法
- 全链路压测实施思路流程分析
- 前端数据可视化D3 ——(案例1)柱状图
- 一位老人告诉我的人生哲理