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[ ...
随机推荐
- spring线程池的同步和异步(1)
spring线程池(同步.异步) 一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent ...
- At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger fo
一.文章前言 本文是亲测有效解决At least one JAR was scanned for TLDs yet contained no TLDs问题,绝对不是为了积分随便粘贴复制然后压根都没有用 ...
- python gdal ogr osgeo
- sqlserver2016 kb补丁
1. win2012r2 安装时 总是提示: 然后费了半天劲 下载下来又提示 找了一下 需要先安装这么一个补丁才可以 KB2919442 然后才能安装上 KB2919355 然后就可以正常安装了:
- CMD命令打包文件夹成jar
网上的很多例子都是直接将在dos界面下输入jar命令出现的帮助信息给贴上了.不明白的人根本看不懂.当然我也看不懂,好在自己试了好多遍,终于成功了.现在我就根据我刚刚的操作来说明一下. 我介绍的是将一个 ...
- 搭建Nuxt项目(搭配Element UI、axios)
使用Nuxt Nuxt.js文档:https://zh.nuxtjs.org/guide/ 开始 初始化Nuxt项目 npx create-nuxt-app <项目名> // or yar ...
- Tosca 添加 modules,添加Library,引用重复步骤
#增加modules modules模块式基础,好像一切都得从modules开始,想下面这样一个简单的login module就建好了 把这个module login 拖到具体的test case上 ...
- pyqt5界面
用pyqt5做了一个小程序,保留一下这个固定格式: import sys from PyQt5 import uic, QtGui from PyQt5.QtGui import QWindow fr ...
- Laya微信小游戏本地缓存
测试版本2.1.1.1 查看bin/libs/laya.wxmini.js. 发现只会缓存png,jpg. 声音和atlas,json不会缓存. 对比白鹭,白鹭是将png,jpg,atlas,json ...
- 转 mysql awr 报告
1. https://github.com/noodba/myawr 2. https://www.cnblogs.com/zhjh256/p/5779533.html