计数排序( Count sort)

一个不需要比较的,类似于桶排序的线性时间排序算法。该算法是对已知数量范围的数组进行排序。其时间复杂度为O(n),适用于小范围集合或重复元素多的排序。计数排序是用来排序0到100之间的数字的最 
好的算法。

1.算法描述:

“抽屉原理”

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

2.算法属性:

  • 稳定性:不稳定
  • 时间复杂度:O(n)
  • 空间复杂度:O(M)

3.代码实现

#时间复杂度O(n)
#kumata 's code
'''
三个步骤:
1.找出最大最小值
2.根据最大最小值差制造抽屉,把元素放进“抽屉”
3.把“抽屉”里面的元素拿出来重新排列
'''
import time
def count_sort(nums):start = time.time()    mmax, mmin = nums[0], nums[0]#第一个for循环找到最大值和最小值for i in range(1, len(nums)):if (nums[i] > mmax): mmax = nums[i]elif (nums[i] < mmin): mmin = nums[i]print('最大值:',mmax)print('最小值:',mmin)#“发抽屉”,制造多少个抽屉drawer = mmax - mmin + 1#刚开始抽屉里全部都是0counts = [0] * drawerprint('抽屉数:',counts)   #通过index把元素往抽屉里面放for i in range (len(nums)):counts[nums[i] - mmin] = counts[nums[i] - mmin] + 1#把抽屉里面的元素拿出来重新排列#第一个for循环为抽屉的大小,第二个为抽屉里每个元素的个数,所以时间复杂度实为O(n)pos = 0for i in range(drawer):      for j in range(counts[i]):nums[pos] = i + mminpos += 1t = time.time() - startreturn nums, t#输出结果
最大值: 45
最小值: 1
抽屉数: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

([1, 2, 3, 4, 5, 6, 8, 11, 22, 45], 0.0005011558532714844)

转载于:https://www.cnblogs.com/kumata/p/9122997.html

计数排序之python相关推荐

  1. 计数排序(python)

    8.计数排序 8.1 算法思想 计数排序是一个非基于比较的排序算法.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),当o(k)< o(nlogn)时快于任 ...

  2. 计数排序之python 实现源码

    old = [2, 5, 3, 0, 2, 3, 0, 3] new = [0, 0, 0, 0, 0, 0] for i in range(len(old)):new[old[i]] = new[o ...

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

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

  4. 十大经典排序算法(图解与代码)——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序(Python and Java)

    排序 重新排列表中的元素,使表中的元素按照关键字递增或者递减 内部排序: 指在排序期间,元素全部存放在内存中的排序 外部排序: 指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断 ...

  5. 计数排序、桶排序和基数排序的运算性能对比及总结区别(附python代码)

    首先证明一波排序算法的运算性能,如下图.对于50万个数据的无序列表,时间复杂度为的桶排序和计数排序明显比复杂度为的归并排序和快速排序性能好至少一个数量级. 1. 计数排序  1.1 基本原理:首先确定 ...

  6. 计数排序与桶排序python实现

    计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...

  7. Python实现计数排序

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

  8. python 替换array中的值_Python实现计数排序

    一.计数排序简介 计数排序(Counting Sort)是一种不比较数据大小的排序算法,是一种牺牲空间换取时间的排序算法.计数排序适合数据量大且数据范围小的数据排序,如对人的年龄进行排序,对考试成绩进 ...

  9. 计数排序和桶排序——python和javascript实现

    计数排序 python版 不稳定计数排序 # 不稳定计数排序 def count_sort(arr):max,min = findMaxAndMin(arr)space = max - mincoun ...

最新文章

  1. 2019年上半年收集到的人工智能机器学习方向干货文章
  2. 好用的Eclipse 插件
  3. mysql數據庫的增刪改查_MySQL數據庫之基礎增刪改查操作
  4. Go并发调用的超时处理
  5. 操作系统–银行家算法c语言代码
  6. 永磁同步电机的直接转矩控制(二)一一一传统DTC仿真结果分析
  7. 深度学习模型并非“越大越好”,它可能引起气候变化问题
  8. IB心理学生物分析模块
  9. 链家网租房信息数据分析——从爬虫到房租预测
  10. 利用GitHub搭建个人网站
  11. linux怎么进入系统安装界面,Linux图形化界面安装全过程
  12. vue按住shift键多选(以element框架的table为例)
  13. 指南|查询美国的关税清单
  14. Centos 6.5、7升级安装openssh8.2p1
  15. K8S多节点二进制部署
  16. Linux 系统安全应用
  17. Halcon消除畸变
  18. ups不间断电源品牌哪家好?
  19. java编程的一个猜数字有趣小游戏
  20. HTB-AdmirerToo

热门文章

  1. 简单图文配置golang+vscode【win10/centos7+golang helloworld+解决install failed等情况】
  2. 快速给shell脚本加上使用提示
  3. python装饰器学习
  4. Hopfiled 神经网络实例解释
  5. 路遥知马力——Momentum动量梯度
  6. 彻底解决python打印结果省略号的问题显示宽度
  7. LeetCode简单题之山羊拉丁文
  8. 什么是OpenMAX技术分析OpenMAX
  9. Python分析离散心率信号(下)
  10. 自然语言推理和数据集