时间复杂度为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 先让 左有序,右有序. 归并 ...
最新文章
- Prim算法求权数和,POJ(1258)
- FreeSWITCH在呼叫失败的情况下如何播放语音提示
- 经常使用的MySQL语句整理
- Winpcap进行抓包,分析数据包结构并统计IP流量
- cascade在java_【Java基础】集合
- web.config配置数据库连接
- [css] 如何清除在项目中无用的css代码呢?
- 的写法_朋友圈文案标题的写法
- padavan安装php,求助!帮忙解决newifi3路由器安装hiboy老毛子系统后开启onmp后打开phpmyadin出错!...
- apt-get安装mysql
- windows10环境下node js版本快速升级
- 全双工音频播放器在c#中使用waveIn / waveOut api
- 用浏览器控制台查看ajax请求
- Java编程:排序算法——希尔排序
- 日本公司推出第一款MR购物应用,今秋上市
- 1-4 正弦和余弦
- Windows XP 深度增强精简版下载 - Deepin XP Lite V2
- 如何成为一名白帽子?
- Tiny语言编译器简介
- 微软量子论文撤稿,谷歌“量子霸权”受质疑,量子计算的狂热需一盆冷水清静