计数排序的特点:

  • 需要额外的数组以存储:

    • 中间过程数据(记为数组 C),数组 C 的下标是待排序序列的元素值,下标对应的值为出现的次数;
    • 排序后的序列(记为 B),计数排序仅获取原始待排序序列的值,对原始序列不做 in-place 处理;
  • 计数排序首先统计原始序列各个数(按顺序,也就是索引)出现的次数,需要获取原始序列的最大值,作为计数数组的区间长度;
def counting_sort(A, k):
# k = max(A) + 1
C = [0]*k
for i in A: # 统计 A 中各个数出现的次数,C 的下标为 A 的元素值
C[i] += 1
for i in range(1, len(C)):
C[i] += C[i-1] # 不断累加
# print('C: ', C) # C 的下标为 A 的元素值, C 下标对应的值为此元素值应在排序后的序列中的位置
B = [0]*(len(A)+1)
for i in A[::-1]:
B[C[i]] = i # C 下标对应的值为此元素值应在排序后的序列中的位置
C[i] -= 1 # 原始序列中重复出现的数字在排序过程中不断地向前排;
return B if __name__ == '__main__':
A = [2, 5, 3, 0, 2, 3, 0, 3]
k = max(A)+1
B = counting_sort(A, k)
print('B: ', B)

【算法导论】【排序】—— 计数排序(counting sort)的更多相关文章

  1. 《算法导论》——计数排序Counting Sort

    今天贴出的算法是计数排序Counting Sort.在经过一番挣扎之前,我很纠结,今天这个算法在一些scenarios,并不是最优的算法.最坏情况和最好情况下,时间复杂度差距很大. 代码Countin ...

  2. MIT算法导论——第五讲.Linear Time Sort

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

  3. 排序算法六:计数排序(Counting sort)

    前面介绍的几种排序算法,都是基于不同位置的元素比较,算法平均时间复杂度理论最好值是θ(nlgn). 今天介绍一种新的排序算法,计数排序(Counting sort),计数排序是一个非基于比较的线性时间 ...

  4. "《算法导论》之‘排序’":线性时间排序

    本文参考自一博文与<算法导论>. <算法导论>之前介绍了合并排序.堆排序和快速排序的特点及运行时间.合并排序和堆排序在最坏情况下达到O(nlgn),而快速排序最坏情况下达到O( ...

  5. Hark的数据结构与算法练习之计数排序

    算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定 ...

  6. 算法笔记_129:计数排序(Java)

    目录 1 问题描述 2 解决方案 2.1比较计数排序 2.2 分布计数排序   1 问题描述 给定一组数据,请使用计数排序,得到这组数据从小到大的排序序列. 2 解决方案 2.1比较计数排序 下面算法 ...

  7. java-数组排序--计数排序、桶排序、基数排序

    计数排序引入 不难发现不论是冒泡排序还是插入排序,其排序方法都是通过对每一个数进行两两比较进行排序的,这种方法称为比较排序,实际上对每个数的两两比较严重影响了其效率,理论上比较排序时间复杂度的最低下限 ...

  8. 算法导论--python--插入排序

    #!/usr/local/python35/bin/python3.5 #### insert sort if __name__=="__main__": var_list=[3, ...

  9. 计数排序Counting sort

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

随机推荐

  1. URL组成部分详解

    URL组成部分详解 URL是Uniform Resource Locator的简写,统一资源定位符. 一个URL是由以下几部分组成的: scheme://host:port/path/?query-s ...

  2. 8、TypeScript-解构赋值

    1.数组的解构赋值 2.对象的解构赋值 注意:在浏览器环境中,windows本身有一个成员name,所以要重新,语法为  属性名:重命名 3.函数的解构赋值

  3. JVM工具jstat使用说明

    输入:jstat -help得到以下帮助信息 Usage: jstat --help|-options jstat -<option> [-t] [-h<lines>] < ...

  4. javascript 十进制转换为二进制

    1.十进制转换为二进制 var toBin = (n) => { if(n == 0) return '0'; var res = ''; while(n != 0) { res = n % 2 ...

  5. RK3288 GPIO

    简介GPIO, 全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚.RK3288有9组 GPIO bank: GPIO0,G ...

  6. 关于Url路径中出现特殊字符,文件无法下载的问题

    1.原网址  传送门:http://blog.csdn.net/jackljf/article/details/43796137 在站点根目录新建或编辑web.config 文件,找到<syst ...

  7. 关于:无法创建链接服务器 "ORCL" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的实例 (错误:7302)

    本人接触和使用Oracle数据库才有一个季度的时间,问题比较白,大神请无视本文. 环境: 1.数据服务器,windows2008R2,Oracle11g 2.报表服务器,windows2008R2,S ...

  8. 五、docker网络技术

    五 docker网络技术 1.本章环境: 源码文件目录: 2.网络基础回顾 通道: NAT将私有地址和端口号翻译成公有的地址和端口号项某网站发出数据包.某网站根据数据表查出私有ip和端口号返回数据. ...

  9. 对低开销的静态组件使用v-once

    <body> <div id="app"> <terms-of-service></terms-of-service> </d ...

  10. Excel文件上传功能实现

    $(function(){ let file; //上传点击事件 $('#btn').bind('click', function(){ let val = $('#fb').filebox('get ...