基于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基础教程之基本内置数据类型介绍
Feb 20 Python
python局域网ip扫描示例分享
Apr 03 Python
python根据出生日期获得年龄的方法
Mar 31 Python
教你用一行Python代码实现并行任务(附代码)
Feb 02 Python
python3中获取文件当前绝对路径的两种方法
Apr 26 Python
Python数据集切分实例
Dec 08 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
用Python做一个久坐提醒小助手的示例代码
Feb 10 Python
Django values()和value_list()的使用
Mar 31 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
PHP获取MAC地址的函数代码
2011/09/11 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
Vue 仿百度搜索功能实现代码
2017/02/16 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
高性能js数组去重(12种方法,史上最全)
2019/12/21 Javascript
python数据清洗系列之字符串处理详解
2017/02/12 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
电子商务专业学生的自我鉴定
2013/11/28 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
政风行风评议整改方案
2014/09/15 职场文书
2014年村委会工作总结
2014/11/24 职场文书
大学生创业事迹材料
2014/12/30 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
校园广播站开场白
2015/06/01 职场文书