计数排序是一种在数值小于100以内十分高效的排序算法,时间复杂度为O(n),原理十分简单,是一个桶的简单运用(后面有机会再详细介绍介绍桶)。比如我们排序元素的数值分布在1-100,那么首先遍历一遍数组,记录1-100每个数值出现的个数,比如1,10,1,12,那么1出现了2次,10出现了1次,12出现了1次。就这样,两次O(n)时间复杂度的遍历就可以完成排序,这种只适用于数组最大值和最小值差值不大的情况,这种情况效率很高,但是如果差值较大,时间和空间开销都很高。

  • 算法步骤:
    (1)找出待排序的数组中最大和最小的元素
    (2)统计数组中每个值为i的元素出现的次数,存入数组C的第i项
    (3)对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
    (4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

  • 代码如下:
def countingSort(arr, maxValue):"""计数排序,nums为待排序数组,left、right为数组左端和右端的索引>>>countingSort([3, 5, 15, 36, 38, 44], 44)>>>[3, 5, 15, 36, 38, 44]"""bucket = [0]*(maxValue+1)for n in nums:bucket[n] += 1sortedIndex = 0for i in range(maxValue+1):while bucket[i] > 0:nums[sortedIndex] = isortedIndex += 1bucket[i] -= 1return nums
nums = [3,38, 5, 5, 44, 15, 36]
countingSort(nums, max(nums))
  • 该算法时间复杂度很明显是两个O(n),也就是O(n),空间复杂度,由于额外维护了一个桶,长度为数组长度,因此空间复杂度为O(n)。同时该算法是一种稳定排序算法,相同元素的相对位置不会发生变化。

排序算法专题-计数排序相关推荐

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

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

  2. 【排序算法】计数排序引发的围观风波——一种O(n)的排序

    前言 计算机课上,老师给一串数字6 1 6 9 9 1 4 2 1 5 8 8,问道:这一串数字,你们写个程序给我看,要求效率较高.学不出来的别下课了. 顿时场下一片哗然,但有很多小朋友硬着头皮啪啪啪 ...

  3. java sorted排序_【算法】排序算法之计数排序

    前几回,我们已经对冒泡排序.直接插入排序.希尔排序.选择排序.快速排序.归并排序.堆排序做了说明分析.本回,将对计数排序进行相关说明分析. 一.排序算法系列目录说明 冒泡排序(Bubble Sort) ...

  4. c++ 二维数组 排序_【算法】排序算法之计数排序

    前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...

  5. 【排序算法】计数排序

    当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法. 由于用来计数的数组B的长度取决于待排序数组中数据的范围(等于 ...

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

    不知道为什么,突然编辑器不支持颜色丰富的intellij IDEA直接复制了,博主有点沮丧,因此我先用图片的形式展示并分析,然后在最后会将全部代码呈上 排序思想:在一个数组中,对于每一个数据,都统计有 ...

  7. Python排序算法之计数排序

    目录 简介 代码示例 简介 已知列表的元素范围在0到100,设计一个复杂度为O(n)的算法在类似这种情况下,计数排序比sorted还要快 代码示例 #!/usr/bin/python3 # -*- c ...

  8. 排序算法:计数排序(Python)

    思路:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中.作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数. 一图解百惑,上图!  话不多说,上代码! def ...

  9. [Alg]排序算法之分布排序

    [Alg]排序算法之分布排序 作者:屎壳郎 日期:Aug 2021 版次:初版 简介: 分布排序是与归并排序截然相反的处理思路,归并排序是逐步融合归并,而分布排序是分组然后合并,再分组再合并,所以分布 ...

  10. 排序算法:桶排序、计数排序、基数排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 这篇博客将主要介绍三种时间复杂度是 ...

最新文章

  1. 中下层确实没钱了,消费枯竭!?
  2. 概率统计:第三章 多维随机变量及其分布
  3. AIR 中 File 对象的几个系统文件夹及其属性.
  4. 35、JAVA_WEB开发基础之过滤器
  5. python gui编程框架添加工具栏_Python之GUI实现
  6. oracle百万级数据导入,用Perl从oracle导出百万级数据到excel
  7. [Linux] DSO missing from command line
  8. 在 for 循环里写加号拼接字符串的那个同事,不见了~
  9. web系统之猜数游戏——项目总结
  10. CC00088.CloudKubernetes——|KuberNeteskubeadm.V17|5台Server|——|kubernetes验证|dashboard配置|
  11. 私有CA搭建并将HTTPS应用于Tomcat、Springboot
  12. 计算机应用基础补考申请书,院级教改课题申请书计算机应用基础教学.doc
  13. DMSP/OLS夜间灯光遥感影像数据概述
  14. 一文读懂SpringCloud全家桶
  15. 统计学简介之十六——单因素方差分析
  16. ESP32 HTTP 使用入门
  17. 生活.小米移动电话卡1718或1719号段的接入点设置
  18. Wifi密码 (10分)
  19. android引用ui,简介 - 如何引用 - 《XUI - Android 原生 UI 框架》 - 书栈网 · BookStack...
  20. python+selenium 浏览器驱动下载

热门文章

  1. Java设计模式之模板(template)方法模式
  2. 3.React学习笔记(完)----nodejs命令备份+跨域问题处理
  3. android实现nfc支付宝,支付宝首次支持NFC与LBS 实现快速手机支付
  4. linux麒麟安装教程,优麒麟使用教程第四期:Linux平台U盘启动盘制作
  5. python截图保存到内存卡_没有长截图功能,一招即可截下来!
  6. python对于一元线性回归模型_Python|机器学习-一元线性回归
  7. (day 43 - 二分查找 ) 剑指 Offer 53 - II. 0~n-1中缺失的数字
  8. python中%的用法_python中%的用法
  9. BraftEditor:插入图片删除后在服务器将图片同步删除
  10. Cesium:添加按钮与原生按钮样式相同