计数排序是一种基于特定范围之间的键的排序技术。它通过计算具有不同键值(散列类型)的对象的数量来工作,然后做一些算术来计算每个对象在输出序列中的位置。

计数排序的特点

  • 计数排序对数据进行假设,例如,它假设值将在 0 到 10 或 10 - 99 等范围内,计数排序所做的另一个假设是输入数据都是实数。
  • 与其他算法不同的是,此排序算法不是基于比较的算法,它对临时计数数组中的值进行散列处理并使用它们进行排序。
  • 计数排序使用一个临时数组,使其成为非就地(in place)算法

举个例子

  • 为简单起见,我们考虑 0 到 9 范围内的数据。
  • 输入数据: {1, 4, 1, 2, 7, 5, 2}
  • 取一个计数数组来存储每个唯一对象的数量。

  • 遍历原始数组,并将每个元素的计数存储到计数数组中
  • 在这个例子中,计数数组中每个唯一元素的计数如下所示:
    • 索引:0 1 2 3 4 5 6 7 8 9
    • 计数:0 2 2 0 1 1 0 1 0 0
  • 然后对计数数组进行累加,使每个索引处的每个位置的值都等于先前计数的总和。
    • 索引:0 1 2 3 4 5 6 7 8 9
    • 计数:0 2 4 4 5 6 6 7 7 7
  • 计数数组中的元素便是最初数组中与其对应的元素在输出数组中的索引+1
  • 最后我们逆向遍历原始数组,并根据其对应的计数值将元素放置到结果数组的对应索引处,再将其对应的计数值 -1

注意:

时间复杂度: O(n),其中 n 是元素的总数

辅助空间: O(n)

其他特点:

  • 如果输入数据的范围不明显大于要排序的对象数,则计数排序是有效的。考虑输入序列在范围 1 到 10K 之间并且数据为 10、5、10K、5K 的情况。
  • 它不是基于比较的排序。它的运行时间复杂度为 O(n),空间与数据范围成正比。
  • 计数排序的实现是基于我们对要排序的数的一些假设。
  • 它通常把计数排序用作另一个排序算法(如基数排序)的子程序。
  • 计数排序使用部分散列来计算 O(1) 中数据对象的出现次数。
  • 计数排序也可以扩展到负输入。
  • 计数排序不是一个稳定的排序算法,但是可以通过一些更改使其稳定。

代码实现下载链接:

(包含各种语言:C语言、Python、Java、C++等均有示例)

免费​资源下载:Counting Sort

计数排序 | Counting Sort相关推荐

  1. C语言计数排序Counting sort 算法(附完整源码)

    计数排序Counting sort 算法 计数排序Counting sort 算法的完整源码(定义,实现,main函数测试) 计数排序Counting sort 算法的完整源码(定义,实现,main函 ...

  2. 计数排序/Counting Sort

    计数排序的算法思想: 对于每一个元素x,只要确定了元素x有多少个比它小的元素,那么就可以知道其最终的位置. 记输入数组为A[n],存放最后排序输出的数组为B[n],提供临时存储空间的中间数组记为C[k ...

  3. 计数排序Counting sort

    注意与基数排序区分,这是两个不同的排序 计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长 大体分两部分,第一部分是拉选票和投票,第二部分是根据你的票数入桶 ...

  4. 计数排序(Counting sort)

    计数排序 适用范围 计数排序可以说是桶排序的一种特殊情况,当排序n个数据时,n的取值范围很小的时候,比如说是0-k,我们就可以分成k个桶,因为桶内的数据都是一致的,所以可以减少了桶内排序的时间. 举个 ...

  5. java最全基础知识_Java编程入门,计数排序(Counting Sort)怎么做?

    计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中. 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数. 计数排序(Counting sort)是一种稳定的排 ...

  6. 排序算法---计数排序(java版)

    计数排序 原理 计数排序(Counting Sort) 使用了一个额外的数组 C,其中第 i 个元素是待排序数组A 中值等于 i 的元素的个数.然后根据数组 C 来将 A 中的元素排到正确的位置.其实 ...

  7. 排序算法之计数排序、基数排序和桶排序

    转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...

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

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

  9. Python实现计数排序

    Python实现计数排序 一.计数排序简介 计数排序(Counting Sort)是一种不比较数据大小的排序算法,是一种牺牲空间换取时间的排序算法. 计数排序适合数据量大且数据范围小的数据排序,如对人 ...

  10. 算法学习总结(八):计数排序

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

最新文章

  1. react 快速上手开发_React中测试驱动开发的快速指南
  2. 转:JAVA常见错误处理方法 和 JVM内存结构
  3. MyBatis的一对和多对对和动态SQL
  4. directshow c++ 设置 曝光_DirectShow 接口访问相机参数设置方法
  5. 转--Oracle数据类型及存储方式【C】
  6. python 倒计时_Excel制作竞答倒计时器
  7. 如何使用 Node 后端创建 React 应用程序:完整指南
  8. 数据结构与算法 Python语言描述 笔记
  9. python半圆_如何使用Python中的Zelle图形生成一个半圆?
  10. 深入解读RabbitMQ工作原理及简单使用
  11. 飞鸽传书:webbrowser 本生是一个控件
  12. java requirenonnull_Java null判断新方法:Objects.requireNonNull 你过用吗?
  13. php 做圆形头像,php制作圆形用户头像方法
  14. cmdn(聪明的女人)
  15. Vue-pdf预览pdf文档
  16. 在linux中PHP的集成环境吗,linux有php集成环境吗
  17. 职业规划-服务器运维工程师(待完善)
  18. Easyui DataGrid Editor
  19. 文件管理(以Unix系统为例)
  20. grad-cam原理

热门文章

  1. BUG: Cannot retrieve debugging output
  2. 腾讯通RTX拓展功能
  3. 银行核心系统之假期表
  4. 库克是个挺不错的接班人,但是苹果公司的价值已经见顶
  5. 力扣刷题 DAY_67 回溯
  6. Codeforces Round #469 (Div. 2) F. Curfew
  7. DWT(离散小波变换)
  8. c java gs_Java基础-gs(垃圾回收)
  9. html卡牌游戏代码,查看“宝可梦卡牌游戏DPt系列”的源代码
  10. O3DF执行董事Royal O’Brien:开源没有边界,所有共享的声音都会变成实际方向