本博客转自:https://blog.csdn.net/wardseptember/article/details/81434641
以下是本人自己理解,共勉!
"""计数排序--算法思想:假设要排序的数组为 nums = [1,0,3,1,0,1,1]结果输出:[0, 0, 1, 1, 1, 1, 3]1、首先求出nums的长度,最大值和最小值。nums_len = 7nums_max = 3nums_min = 02、创建一个数组 counting_arr: 统计nums中每个元素的个数,counting_arr数组长度为 :nums_max+1-nums_min = 3+1-0=4统计nums中每个元素出现的次数,输出 counting_arr为:[2,4,0,1]比如:0的出现次数为2, 1出现次数为4, 2出现的次数为0, 3出现的次数为1.3、分别统计比0,1,3小的元素个数:如比0小(包括0)的元素有2个,如比1小(包括1)的元素有6个,如比3小(包括3)的元素有7个.更新counting_arr=[2,6,6,7]4、最后把在counting_arr中的记录按每个元素的计数展开到输出数组ordered中。举例:将nums = [1,0,3,1,0,1,1] 的元素根据counting_arr=[2,6,6,7]映射到ordered=[l0,0,0,0,0,0,0]中从nums的末尾开始遍历:执行这两句:  ordered[counting_arr[nums[i] - nums_min] - 1] = nums[i]counting_arr[nums[i] - nums_min] -= 1i=6时:  ordered[counting_arr[nums[6] - 0] - 1] = nums[6]ordered[counting_arr[1] - 1] = 1ordered[6-1] = 1ordered[5] = 1更新:  ordered=[l0,0,0,0,0,1,0]counting_arr=[2,5,6,7]i=5时:  ordered[counting_arr[nums[5] - 0] - 1] = nums[5]ordered[counting_arr[1] - 1] = 1ordered[5-1] = 1ordered[4] = 1更新:    ordered=[l0,0,0,0,1,1,0]counting_arr=[2,4,6,7]i=4时:  ordered[counting_arr[nums[4] - 0] - 1] = nums[4]ordered[counting_arr[0] - 1] = 0ordered[2-1] = 0ordered[1] = 0更新:    ordered=[0,0,0,0,1,1,0]counting_arr=[1,4,6,7]i=3时:  ordered[counting_arr[nums[3] - 0] - 1] = nums[3]ordered[counting_arr[1] - 1] = 1ordered[4-1] = 1ordered[3] = 1更新:    ordered=[0,0,0,1,1,1,0]counting_arr=[1,3,6,7]i=2时:  ordered[counting_arr[nums[2] - 0] - 1] = nums[2]ordered[counting_arr[3] - 1] = 3ordered[7-1] = 3ordered[6] = 3更新:    ordered=[0,0,0,1,1,1,3]counting_arr=[1,3,6,6]i=1时:  ordered[counting_arr[nums[1] - 0] - 1] = nums[1]ordered[counting_arr[0] - 1] = 0ordered[1-1] = 0ordered[0] = 0更新:    ordered=[0,0,0,1,1,1,3]counting_arr=[0,3,6,7]i=0时:  ordered[counting_arr[nums[0] - 0] - 1] = nums[0]ordered[counting_arr[1] - 1] = 1ordered[3-1] = 1ordered[2] = 1更新:    ordered=[0,0,1,1,1,1,3]counting_arr=[1,2,6,7]"""def counting_sort(nums):if nums is None:return []nums_len = len(nums)nums_max = max(nums)nums_min = min(nums)counting_arr_length = nums_max + 1 - nums_mincounting_arr = [0] * counting_arr_lengthfor number in nums:#   统计列表中每个值出现的次数,counting_arr[number - nums_min] += 1#   使counting_arr[i]存放<=i的元素个数for i in range(1, counting_arr_length):counting_arr[i] = counting_arr[i] + counting_arr[i-1]#   存放排序结果ordered = [0] * nums_lenfor i in reversed(range(0, nums_len)):ordered[counting_arr[nums[i] - nums_min] - 1] = nums[i]counting_arr[nums[i] - nums_min] -= 1return orderedif __name__ == '__main__':draw_input = inputuser_input = draw_input('输入待排序的数,用\",\"分隔:\n').strip()unsorted = [int(item) for item in user_input.split(',')]print(counting_sort(unsorted))

Fighting-算法-计数排序相关推荐

  1. 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid

    三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...

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

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

  3. 算法——计数排序与快速排序

    计数排序是一种算法复杂度 O(n) 的排序方法,适合于小范围集合的排序.比如100万学生参加高考,我们想对这100万学生的数学成绩(假设分数为0到100)做个排序.我们如何设计一个 最高效的排序算法. ...

  4. 【vlfeat】O(n)排序算法——计数排序

    今天想在网上找一个实现好的er算法来着,没啥具体的资料,无奈只能看vlfeat的mser源码,看能不能修修补补实现个er. 于是,看到某一段感觉很神奇,于是放下写代码,跑来写博客,也就是这段 1 /* ...

  5. 数据结构与算法 | 计数排序

    之前的几篇讲解了所有常用的比较排序,这次就来讲一讲非比较排序的计数排序. 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用.和其他排序不一样,计数排序并不是通过比较元素的大小来实现的,而是通过统计 ...

  6. 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid

    转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...

  7. 排序算法——计数排序详解

    在排序的最终结果中,各元素的次序依赖于它们之间的比较.这类排序算法被称为比较排序.对于包含 nnn 个元素的输入序列来说,任何比较排序算法在最坏情况下都要经过至少 O(nlogn)O(n\ log\ ...

  8. 十大排序算法——计数排序

    计数排序 一. 计数排序介绍 二. 计数排序基础版 三. 计数排序改进版 四. 优化最终版本_空间节省 一. 计数排序介绍 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个 ...

  9. 算法 - 计数排序(Counting_Sort)

    目录 引言: 学习: 什么是计数排序(Counting_sort)? 定义: 算法思想: 排序过程: Step 1 : Step 2 : Step 3 : Step 4 : Step 5 : 依次进行 ...

  10. 排序算法 —— 计数排序

    引言 计数排序是桶排序思想的一种具体实现,针对一些具有特殊限制的样本数据,如公司员工年龄,那么样本数据本身就一定在0~200之间,针对这样的数据,使用从0到200 的桶数组,桶的位置已经是有序的,只需 ...

最新文章

  1. Oracle 11gR1中细粒度拜候搜集效劳(2)
  2. react native 组件之switch组件的用法
  3. c语言稀疏矩阵做除法,稀疏矩阵的除法
  4. 百度语音识别rest html,delphi调用百度语音识别REST API(示例代码)
  5. 数据库---初识sql语句
  6. 在Ubuntu 14.04平台上利用Intel的GPU实现硬件加速--基于VAAPI
  7. ylb:SQL 系统函数
  8. Spring Boot/Cloud 背后豪华的研发团队
  9. [转]ISO镜像工具PowerISO和UltraISO制作ISO光盘镜像教程
  10. 联合索引(a,b,c),怎么单独检索b用上索引
  11. 大华 解码器上大屏代码事例
  12. 利用Eclipse的TaskList功能进行任务管理
  13. 速达5000维护服务器,财务软件速达5000为什么连不上服务器
  14. 中小型城市商业银行数字化转型实践(一)整体技术架构转型(双态IT)
  15. android camera预览翻转,android camera yuv帧水平翻转实例
  16. linux下拷贝某一时间段的文件
  17. lol1月8日服务器维护,LOL2018年1月16日停机维护公告_LOL国服8.1版本更新内容汇总_飞翔教程...
  18. linux 常用文本处理工具
  19. SCI论文思维导图:写作技巧(2)
  20. 零基础wordpress安装详细教程(收藏)

热门文章

  1. 宽带有哪几种接入方式
  2. 华为——链路捆绑LACP
  3. HTML之colgroup与col
  4. vue table使用colgroup进行表格自定义宽度
  5. 【FFmpeg学习】FFmpeg常见的结构体
  6. 人体神经网络应用领域,人体神经网络应用研究
  7. dos运行mu linux,MU 文件扩展名: 它是什么以及如何打开它?
  8. gyp linux,使用gyp
  9. 东芝dynabook A40-J 评测
  10. 【Microsoft Edge】关于 Microsoft Edge 浏览器多版本安装目录结构的测试分析