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读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
Python中optparser库用法实例详解
Jan 26 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
python使用knn实现特征向量分类
Dec 26 Python
Python 经典算法100及解析(小结)
Sep 13 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 Python
Python如何使用logging为Flask增加logid
Mar 30 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(视频)Http下载
2006/12/12 PHP
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php实现socket推送技术的示例
2017/12/20 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
2020/10/28 PHP
js 字符串转化成数字的代码
2011/06/29 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
Angular6封装http请求的步骤详解
2018/08/13 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
Python生成随机MAC地址
2015/03/10 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
书法培训心得体会
2014/01/05 职场文书
自行车租赁公司创业计划书
2014/01/28 职场文书
无毒社区工作方案
2014/05/23 职场文书
推广普通话标语
2014/06/27 职场文书
合作协议书范本
2014/10/25 职场文书
七一晚会主持词
2015/06/29 职场文书
企业愿景口号
2015/12/25 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
解决Python字典查找报Keyerror的问题
2021/05/26 Python
golang内置函数len的小技巧
2021/07/25 Golang