20191104-基于Python计数排序算法分析
计数排序
计数排序算法没有用到元素间的比较,它利用元素的实际值来确定它们在输出数组中的位置,也就是说元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的,将每个元素出现的次数记录到辅助空间后,通过对辅助空间内数据的计算,即可确定每一个元素最终的位置,计数排序算法是一个稳定的排序算法。
算法过程
- 根据待排序集合中最大元素和最小元素的差值范围,申请额外空间;
- 遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内;
- 对额外空间内数据进行计算,得出每一个元素的正确位置;
- 将待排序集合每一个元素移动到计算得出的正确位置上。
给的无序数组,快速得出其排序结果
arr=[9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9 ,7,9]
第一步:求出最大值和最小值,申请额外空间长度等于最大值-最小值+1
|
max_val = max(arr) #max_val = 10 min_val = min(arr) #min_val = 0 temp_arr = [0]*(max_val-min_val+1) |
第二步:遍历待排序集合,将每一个元素出现的次数记录到元素值对应的额外空间内
|
for i in arr: 输出结果: [1, 2, |
这里为什么是temp_arr[i-min_val],是因为我们要计算一个偏移量,比如对数组【91,92,94,95,92,93排序】,申请的temp_arr初始值为temp_arr = [0,0,0,0,0]
当遍历到第一个数91的时候,对应的数组下标为91-min_val(91) = 0
当遍历到第一个数92的时候,对应的数组下标为92-min_val(91) =1
…
这个min_val就是偏移量
第三步:对额外空间内数据进行计算,得出每一个元素的正确位置
统计数组从第二个元素开始,每一个元素都加上前面所有元素之和。相加的目的,是让统计数组存储的元素值,等于相应整数的最终排序位置。
|
for i in range(1,len(temp_arr)): 输出结果: [1, 3, |
以i等于3为例:
次数统计结果为:[1,
2, 1, 3, 2, 2, 1, 2, 1, 4, 1]
当index=2,temp_arr[index]=1(表示2在待排序列表中出现了1次),待排序列表中比2小的元素个数分别为temp_arr[1]+temp_arr[0]个,所以修改temp_arr[2]=4,以此类推后面的数。比如index = 4的temp_arr[4]=9,表示4最终排序的位置是第9个。
第四步:将待排序集合每一个元素移动到计算得出的正确位置上
|
res = [0]*len(arr) 输出结果 [0, 1, |
temp_arr[idx]-1对应为arr[i]在res的位置。
第五步:增加稳定性
从后向前排序
|
res = [0]*len(arr) 输出结果 [0, 1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 7, |
增加稳定性的算法分析
arr=[9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9 ,7,9]。
- 遍历第一个元素9,得出元素9的在temp_arr里面的位置temp_arr_index应该是9-min_val = 9
- 9在排序后的元素列表的位置是res[temp_arr[temp_arr_index]-1]。其中temp_arr[temp_arr_index]=19此处计算结果为第一个9存放位置为19-1,也就是说res[19-1] = 9 第一个9在res的index=18。
- 然后temp_arr[9]-=1得出temp_arr[9]=18
- 当我们再次遇到遇到9的话,其位置在res的索引应该是在18-1=17
- 。。。。
得出结论为排序前后值相等的元素前后顺序改变了,不是稳定排序,索引我们应该从后往前遍历,将其修改为稳定排序。
总结-计数排序的优缺点
- 当数列最大最小值差距过大时,并不适用计数排序,比如给定20个随机整数,范围在0到1亿之间,这时候如果使用计数排序,需要创建长度1亿的数组。不但严重浪费空间,而且时间复杂度也随之升高。
- 如果数列中的元素都是小数,比如25.213,或是0.00000001这样子,则无法创建对应的统计数组。这样显然无法进行计数排序。
计数排序时间复杂度分析
假定元素数组长度为n,最大最小差值为m,则:
- 代码的第1步涉及求最大最小值时间复杂度为n
- 第二步求每个元素的出现次数的时间复杂度为n
- 第三步求元素的正确位置的时间复杂度为m
- 最后一步排序元素的时间复杂度为n
所以总体运算量为3n+m,去除常数,时间复杂度为O(n+m)
原文参考
https://mp.weixin.qq.com/s/WGqndkwLlzyVOHOdGK7X4Q
https://www.jianshu.com/p/86c2375246d7
20191104-基于Python计数排序算法分析的更多相关文章
- 基于python常用排序与查找
""" 排序与查找 -- 冒泡排序 -- 选择排序 -- 快速排序 --****经典 -- 希尔排序 """ # 常用排序的实现 # 冒泡排 ...
- 计数排序与桶排序python实现
计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...
- python实现线性排序算法-计数排序
计数排序假定输入元素的每一个都是介于0到k之间的整数,此处K为某个整数,当k=O(n)时,计数排序的运行时间为O(n) 它的基本思想是:根据每个输入元素x确定小于x的元素个数,根据这个信息把x直接放到 ...
- Java实现基于桶式排序思想和计数排序思想实现的基数排序
计数排序 前提:待排序表中的所有待排序关键字必须互不相同: 思想:计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小,假设针对某一个记录,统计出的计数值 ...
- 【程序员笔试面试必会——排序②】Python实现 计数排序、基数排序
一.计数排序 概要: 时间复杂度O(n),空间复杂度O(k),k是输入序列的值的范围(最大值-最小值),是稳定的.计数排序一般用于已知输入值的范围相对较小,比如给公司员工的身高体重信息排序. 思路: ...
- 计数排序、桶排序python实现
计数排序在输入n个0到k之间的整数时,时间复杂度最好情况下为O(n+k),最坏情况下为O(n+k),平均情况为O(n+k),空间复杂度为O(n+k),计数排序是稳定的排序. 桶排序在输入N个数据有M个 ...
- 基于python对B站收藏夹按照视频发布时间进行排序
基于python对B站收藏夹按照视频发布时间进行排序 前言 在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难, ...
- Python线性时间排序——桶排序、基数排序与计数排序
1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...
- 计数排序之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[ ...
随机推荐
- YARN 状态机可视化,生成状态机图
由于在windows下面,配置好所有 编译hadoop2.4.1源码 的环境会很麻烦,好在我之前已经把hadoop2.4.1的源码成功导入eclipse,并解决了所有错误提示,所以我就可以在eclip ...
- 反编译pyinstaller打包的exe安装包
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译 在这里分享一些技巧和经验给大家.辛苦撰文分享,转载或引用请保留本文作者信息及文章链接. 作者的环境: win ...
- 【转】反编译获取任何微信小程序源码(完)
一.前言最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了一个阿里妈妈淘宝客小程序的前端实现,过程一言难尽,差不多两周时间过去了,发现小程序的坑远比想象的要多的多!!在实际练手 ...
- OGC定义的几何要素
OGC定义了两种描述几何对象的格式,分别是WKB(Well-Known Binary)和WKT(Well-Known Text). 在SQL语句中,用以下的方式可以使用WKT格式定义几何对象:几何类型 ...
- 宝塔php open_basedir restriction in effect
解决方法一: 1.网站管理的 防跨站攻击去掉勾选,重启网站,清除浏览器缓存 解决方法二:
- shared_ptr 引用计数
https://zh.cppreference.com/w/cpp/memory/shared_ptr 引用计数
- SWLU:主核性能采样、调试工具包
http://bbs.nsccwx.cn/topic/262/swlu-主核性能采样-调试工具包
- transition 滑动动画
html: <!-- 组件会在 `currentTabComponent` 改变时改变 --> <transition name="slide" mode=&qu ...
- post请求头中常见content-type(非常重要)
定义和用法 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码.默认地,表单数据会编码为 "application/x-www-form-urlencoded". ...
- linux: E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
今天在使用ubuntu执行下列指令的时候出现了错误: sudo apt-get update 解决办法: 输入以下命令: sudo rm /var/cache/apt/archives/lock su ...