凡是学过数据结构的朋友们大多熟悉一些排序算法,插入排序、冒泡排序、快速排序、和堆排序等。这些排序总的来说都是于比较排序算法,也就是说要对容器中的数据进行大小的比较。在这里合并排序和堆排序都采用了算法中经常使用的一种策略,分而治之来提高效率。他们都属于渐进最优的比较排序算法,时间复杂度达到了O(nlgn),很优秀了,不是么?这里不再唠叨那些比较常见的排序算法,在接下来的几天,我给大家介绍分别介绍计数排序、基数排序和桶排序。
我们所要排序的数据往往是有一定规律的,甚至我们可以对排序数据做某种假设,告诉他们,我的代码在什么什么情况下使用的效率是多么多么的出色。正所谓没有万能的理论,没有万能的代码。计数排序假设输入数据是由一个小范围的数据构成,而且我们利用空间换取了时间。看个例子吧。

void CountingSort(const char *A, int len, char **ret)
{
    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)的计数排序算法相关推荐

  1. 经典排序算法(11)——计数排序算法详解

    计数排序(Counting sort)是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k ...

  2. c ++递归算法数的计数_计数排序算法–在C / C ++中实现的想法

    c ++递归算法数的计数 What is the counting sort algorithm? In Computer Science, sorting algorithms form the b ...

  3. 理解计数排序算法的原理和实现

    计数排序(Counting sort)是一种稳定的线性时间排序算法,其平均时间复杂度和空间复杂度为O(n+k),其中n为数组元素的个数,k为待排序数组里面的最大值.同样具有线性时间排序的算法还有桶排序 ...

  4. JavaScript实现CountingSort计数排序算法(附完整源码)

    JavaScript实现CountingSort计数排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 CountingSort.js完整源代码 Comparato ...

  5. 使其正序排序 打印一串数字_JavaScript计数排序算法

    一.计数排序算法 计数排序(Counting sort)是一种稳定的线性时间排序算法.该算法于1954年由 Harold H. Seward 提出.计数排序使用一个额外的数组,数组的下标对应待排序的数 ...

  6. 计数排序:时间复杂度仅为 O(n) 的排序算法

    一.简介 计算排序假设 n 个输入元素都是 0 到 k 区间内的一个整数,其中 k 为某个整数. 基本原理: 创建一个长度为 k+1 的数组 count[],它的 count[i] 的值对应输入数组中 ...

  7. 计数排序算法——C++

    计数排序是时间复杂度为 O(n)的算法,空间复杂度为O(n):算法思想跟散列表哈希hash有些类似,主要是利用一段有序数组计算对应元素的下表个数,然后依次输出有数组元素进行排列.基本计数排序是不稳定算 ...

  8. c++之计数排序算法

    1.计数排序   计数排序(Counting sort) 是一种稳定的排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的 ...

  9. php常用算法的时间复杂度,php的几个经典排序算法及时间复杂度和耗时​

    $arr = []; for ($i=0; $i 测试结果:排序用时(秒):5.2821290493011 php排序里的经典算法首先想到的就是冒泡排序法, 排序思想:两两交换小数上浮大数下沉每轮浮出 ...

  10. 基础算法-2: 时间复杂度为O(N*logN)的排序算法

    时间复杂度 O(N*logN): 归并排序,堆排序(大根堆,小根堆,heapInsert/heapify),快速排序(荷兰国旗问题). 归并排序 L - Mid - R 先让 左有序,右有序. 归并 ...

最新文章

  1. android studio apt作用,解决Android studio 3.0 apt插件问题
  2. 未能找出类型或命名空间名称“T” 问题的解决方案
  3. 从编译原理看一个解释器的实现
  4. 关于量子计算机 (3)
  5. 聊聊Synchronized
  6. 假如有人把支付宝所有存储服务器炸了,我们在里边的钱是不是都丢了?
  7. jQuery Dom 操作,动态生成dom,绑定事件
  8. android 读取excel数据并保存为xml文件
  9. 《iOS创意程序设计家》——第6.2节导航栏控制器UINavigationController
  10. 标准STUN判断NAT类型的过程及改进
  11. jzoj3501-消息传递【换根法,树形dp】
  12. php点击后增加html元素,如何动态生成html元素以及为元素追加属性的方法介绍(附代码)...
  13. 3-3HDFS中文件的读写操作
  14. 视觉SLAM笔记(58) 字典
  15. autowired注入jar中的依赖_springboot项目中调用jar包中的类时报错 — 没有注入类
  16. 测试之法 —— mock object
  17. ASP.NET C# 实现钉钉签名算法
  18. 全链路压测实施思路流程分析
  19. 前端数据可视化D3 ——(案例1)柱状图
  20. 一位老人告诉我的人生哲理

热门文章

  1. 在springBoot项目中使用activiti
  2. MySQL的启动脚本
  3. python-pycharm使用方法
  4. Paxos算法在大型系统中常见的应用场景
  5. dev gridcontrol 单选框效果
  6. Spring学习14-源码下载地址
  7. 使用Perl实现系统管理自动化(第二版) 中文电子版
  8. 【Caffe】caffe框架讲解,解析修改caffemodel与prototxt
  9. HDFS +zookeeper实现高可用
  10. 第四季-专题13-总线设备驱动模型