基于python进行桶排序与基数排序的总结


Posted in Python onMay 29, 2018

本文首先举例阐述了两种排序方法的操作步骤,然后列出了用python进行的实现过程,最后对桶式排序方法的优劣进行了简单总结。

一、桶排序:

排序一个数组[5,3,6,1,2,7,5,10]

值都在1-10之间,建立10个桶:

[0 0 0 0 0 0 0 0 0 0] 桶

[1 2 3 4 5 6 7 8 9 10] 桶代表的值

遍历数组,第一个数字5,第五个桶加1

[0 0 0 0 1 0 0 0 0 0]

第二个数字3,第三个桶加1

[0 0 1 0 1 0 0 0 0 0]

遍历后

[1 1 1 0 2 1 1 0 0 1]

输出

[1 2 3 5 5 6 7 10]

代码:

def bucket_sort(lst):
 buckets = [0] * ((max(lst) - min(lst))+1)
 for i in range(len(lst)):
  buckets[lst[i]-min(lst)] += 1
 res=[]
 for i in range(len(buckets)):
  if buckets[i] != 0:
   res += [i+min(lst)]*buckets[i]
 return res

二、基数排序:

例如,对如下数据序列进行排序。

192,221,12,23

可以观察到它的每个数据至多只有3位,因此可以将每个数据拆分成3个关键字:百位(高位)、十位、个位(低位)。如果按照习惯思维,会先比较百位,百位大的数据大,百位相同的再比较十位,十位大的数据大;最后再比较个位。基数排序方法对任一子关键字排序时必须借助于另一种排序方法,而且这种排序方法必须是稳定的。对于多关键字拆分出来的子关键字,它们一定位于0-9这个可枚举的范围内,这个范围不大,因此用桶式排序效率非常好。

代码:

from random import randint
def radix_sort(lis,d):
 for i in xrange(d):#d轮排序
  s = [[] for k in xrange(10)]#因为每一位数字都是0~9,故建立10个桶
  for j in lis:
   s[j/(10**i)%10].append(i)
  li = [a for b in s for a in b]
 return li

对数组中的元素按照从低位到高位排序,对于[192,221,12,23]第一轮按照个位数字相同的放在一组,是s[1] =[221],s[2]=[192,12],s[3]=23,第二轮按照十位数字进行排序,s[1]=[12],s[2]=[221,23],s[9]=[192],第三轮按照百位数字进行排序,s[0]=[12,23],s[1]=[192],s[2]=[221]

总结:

桶排序与基数排序常作为桶式排序出现,基数排序进行了多轮的桶排序。桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征:待排序列所有的值处于一个可枚举的范围之类;待排序列所在的这个可枚举的范围不应该太大,否则排序开销太大。可以用于学生成绩的排序,因为在若干学生中成绩的范围仅在100以内。

桶式排序的空间开销较大,它需要两个数组,第1个buckets数组用于记录“落入”各桶中元素的个数,进而保存各元素在有序序列中的位置,第2个数组用于缓存待排数据。它只能排整形数组。而且当k较大,而数组长度n较小,即k>>n时,辅助数组C[k+1]的空间消耗较大。

以上这篇基于python进行桶排序与基数排序的总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 Python
对python:print打印时加u的含义详解
Dec 15 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
python 同时读取多个文件的例子
Jul 16 Python
pymysql 开启调试模式的实现
Sep 24 Python
appium+python adb常用命令分享
Mar 06 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
Python多线程正确用法实例解析
May 30 Python
python属于解释型语言么
Jun 15 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 Python
Vue的el-scrollbar实现自定义滚动
May 29 #Python
基于Django与ajax之间的json传输方法
May 29 #Python
django ajax json的实例代码
May 29 #Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 #Python
PyTorch学习笔记之回归实战
May 28 #Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 #Python
Python实现爬虫爬取NBA数据功能示例
May 28 #Python
You might like
PHP 和 MySQL 基础教程(四)
2006/10/09 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
JS实现的样式切换功能tableCSS实例
2016/12/30 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
2018/01/23 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
Python实现的批量下载RFC文档
2015/03/10 Python
Python制作词云的方法
2018/01/03 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
介绍下java.util.Arrays类
2012/10/16 面试题
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
学生会竞选演讲稿学习部
2014/08/25 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
老兵退伍标语
2014/10/07 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
公务员检讨书
2014/11/01 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python