python实现计数排序与桶排序实例代码


Posted in Python onMarch 28, 2019

计数排序

  1. 找到给定序列的最小值与最大值
  2. 创建一个长度为最大值-最小值+1的数组,初始化都为0
  3. 然后遍历原序列,并为数组中索引为当前值-最小值的值+1
  4. 此时数组中已经记录好每个值的数量,自然也就是有序的了

例如:

python实现计数排序与桶排序实例代码

计数排序实现

下面为列表的计数排序

def count_sort(s):
  """计数排序"""
  # 找到最大最小值
  min_num = min(s)
  max_num = max(s)
  # 计数列表
  count_list = [0]*(max_num-min_num+1)
  # 计数
  for i in s:
    count_list[i-min_num] += 1
  s.clear()
  # 填回
  for ind,i in enumerate(count_list):
    while i != 0:
      s.append(ind+min_num)
      i -= 1

if __name__ == '__main__':
  a = [3,6,8,4,2,6,7,3]
  count_sort(a)
  print(a)

计数排序的缺点

当数值中有非整数时,计数数组的索引无法分配

桶排序

桶排序原理:

  1. 桶排序与计数排序类似,但可以解决非整数的排序
  2. 桶排序相当于把计数数组划分为按顺序的几个部分
  3. 每一部分叫做一个桶,它来存放处于该范围内的数
  4. 然后再对每个桶内部进行排序,可以使用其他排序方法如快速排序
  5. 最后整个桶数组就是排列好的数据,再将其返回给原序列

举例:

python实现计数排序与桶排序实例代码

桶排序实现

这里选择桶的数量为序列元素个数+1,范围分别是5等分与最大值,和上面那个图一样。

具体问题应该按照具体情况进行桶划分

这里桶内部排序直接调用了sorted

def bucket_sort(s):
  """桶排序"""
  min_num = min(s)
  max_num = max(s)
  # 桶的大小
  bucket_range = (max_num-min_num) / len(s)
  # 桶数组
  count_list = [ [] for i in range(len(s) + 1)]
  # 向桶数组填数
  for i in s:
    count_list[int((i-min_num)//bucket_range)].append(i)
  s.clear()
  # 回填,这里桶内部排序直接调用了sorted
  for i in count_list:
    for j in sorted(i):
      s.append(j)

if __name__ == '__main__':
  a = [3.2,6,8,4,2,6,7,3]
  bucket_sort(a) 
  print(a) # [2, 3, 3.2, 4, 6, 6, 7, 8]

总结

计数排序与桶排序都是以牺牲空间换时间,虽然很快,但由于可能产生大量的空位置导致内存增大,尤其是计数排序。

桶排序中尽量使每个桶中的元素个数均匀分布最好

以上所述是小编给大家介绍的python计数排序与桶排序详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python中使用Beautiful Soup库的超详细教程
Apr 30 Python
深入浅析Python字符编码
Nov 12 Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
Python实现数值积分方式
Nov 20 Python
OpenCV 之按位运算举例解析
Jun 19 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
python基础之类属性和实例属性
Oct 24 Python
python实现AES和RSA加解密的方法
Mar 28 #Python
python简单实现AES加密和解密
Mar 28 #Python
Python中dict和set的用法讲解
Mar 28 #Python
python3.x实现base64加密和解密
Mar 28 #Python
python实现AES加密解密
Mar 28 #Python
详解python tkinter教程-事件绑定
Mar 28 #Python
Python中捕获键盘的方式详解
Mar 28 #Python
You might like
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
深入解析php中的foreach函数
2013/08/31 PHP
浅析php工厂模式
2014/11/25 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
2016/10/20 PHP
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
详解基于angular路由的requireJs按需加载js
2017/01/20 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
Python的类实例属性访问规则探讨
2015/01/30 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
django主动抛出403异常的方法详解
2019/01/04 Python
Python地图绘制实操详解
2019/03/04 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
python如何基于redis实现ip代理池
2020/01/17 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
俄罗斯眼镜网: optikaworld
2016/07/31 全球购物
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
教师实习自我鉴定
2013/12/18 职场文书
生产部主管岗位职责
2014/01/06 职场文书
大学生个人自荐信
2014/02/24 职场文书
房屋买卖协议书
2014/04/10 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang