基数排序

概念

基数排序的算法过程是先将待排元素补位,使其长度一致,然后按照序列中的元素的每个位数进行分桶的一种算法。

比如待排序列是数字,则将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

基数排序分类

基数排序的方式分为2类:

LSD(Least significant digital):LSD的排序方式由键值的最右边开始,先比较最低位,也就是个位,进行分桶,分桶过程中分到一个桶中的数据直接追加到桶中即可,无需排序。然后将所有同种的元素按桶的顺序拿出,重新组成序列,然后比较十位,进行分桶…直到比较到最高位,重新组成序列即可完成排序。

MSD(Most significant digital):由键值的最左边开始,先比较最高位,最高位分到一个桶中的,再按照第二位进行分桶…,知道分到最后一位,然后再从最小的桶中逐层向上,把元素都拿出来,即完成排序。

算法过程

1. 不管待排列表是多少个元素,以及元素的长度为多少,都需要创建27个桶,分别对应其他字符以及a-z的26个英文字母

2. 获取待排元素的的最长的单词作为排序的轮数

3. 从低位到高位依次排序(注意:一定是要从地位到高位才能完成我们的字典序)

具体代码分为2个函数,一个函数是获取字母应该放置到哪个桶中,一个函数根据获取的桶的索引将元素放置入桶中

代码

代码1:根据给定单词,以及给定单词的字母的索引(表示当前按照单词的第几个字母进行放置入桶)返回对应的桶的索引

#根据给定英文字母获取对应的桶的索引defgetBucketIndex(word,idx):

ifidx>=len(word):

return0

letter = word[idx]

ifletter>="A"andletter<="Z":

#第一个字母从第buckets的第1个索引开始存储returnord(letter)-ord("A")+1

elifletter>="a"andletter<="z":

returnord(letter)-ord("a")+1

代码2:根据代码1返回的桶的索引放置单词,并且放置后按照桶的位置从0-26逐一取出桶中的单词放回序列,然后进行下一轮排序,一直到排序完最后一轮

#遍历待排列表,进行排序defbucketSort(arr):

#获取最长单词的长度,即排序的轮数sort_round = len(max(arr, key=len))

#将arr中的单词逐一取出,放入对应的bucket中fori inrange(sort_round-1,-1,-1):

#创建一个长度为27的桶,第0个位置存储非字母的元素,其他的存储26字母buckets = [[] fori inrange(27)]

forword inarr:

buckets_idx =

getBucketIndex(word,i)

# print(buckets_idx)buckets[buckets_idx].append(word)

#将桶中的单词按照排序后顺序逐一放回arr中idx = 0

forbucket inbuckets:

forword inbucket:

arr[idx] = word

idx+=1

returnarr

print(bucketSort(arr))

因为python代码的特定,简化算法代码如下:

origin_arr = ["banana","apple","orange","ape","he"]

arr = ["banana","apple","orange","ape","he"]

#获取排序的轮数sort_round = len(max(arr,key=len))

#填充arr的字符串,低位补0,使其具有相同的长度map_dic = {}

fori inrange(len(arr)):

word = arr[i]

iflen(word)

word+="0"*(sort_round-len(word))

map_dic[word] = arr[i]

arr[i] = word

print(arr)

#从低位开始进行比较,排序fori inrange(sort_round):

temp = [0]*len(arr)

arr.sort(key=lambdax:x[-1-i])

result = [map_dic[key] forkey inarr]

print(result)

arr.sort(key=lambdax:x[-1-i])表示先比较最后一位,再比较倒数第二位,倒数第三位。。。

原文参考:

小灰公众号,还有一个博客找不到了,如侵权,请联系本人删除

python将英文字母排序_20191106-基于Python的对字母基数排序相关推荐

  1. Python之PIL之绘图:基于Python的PIL库绘制各种图形、添加文字等

    Python之PIL之绘图:基于Python的PIL库绘制各种图形.添加文字等 目录 一.绘制各种形状各种案例 1.绘制矩形 2.绘制圆形.弧线形

  2. 基于python爬虫技术的应用_基于Python爬虫技术的应用

    办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...

  3. 《Python与硬件项目案例》— 基于Python的口罩检测与指纹识别签到系统设计

    <Python与硬件项目案例>- 基于Python的口罩检测与指纹识别签到系统设计 目录 <Python与硬件项目案例>- 基于Python的口罩检测与指纹识别签到系统设计 1 ...

  4. 《Python与硬件项目案例》— 基于Python与指纹模块AS608的指纹识别签到考勤系统(下篇)(期末大作业、课程设计、毕业设计、结课项目)

    目录 <Python与硬件项目案例>- 基于Python与指纹模块AS608的指纹识别签到考勤系统(下篇) 概述 参考代码 <Python与硬件项目案例>- 基于Python与 ...

  5. oracle 中文拼音取首字母,ORACLE依据中文拼音首字母排序、取得中文拼音首字母函数...

    当前位置:我的异常网» 数据库 » ORACLE依据中文拼音首字母排序.取得中文拼音首字母 ORACLE依据中文拼音首字母排序.取得中文拼音首字母函数 www.myexceptions.net  网友 ...

  6. python 文件格式转换_数据分析:基于Python的自定义文件格式转换系统

    ( 白宁超 2018年7月16日14:47:41 ) 导读:随着大数据的快速发展,自然语言处理.数据挖掘.机器学习技术应用愈加广泛.针对大数据的预处理工作是一项庞杂.棘手的工作.首先数据采集和存储,尤 ...

  7. 基于python的游戏设计与实现-基于Python的网络中国象棋游戏设计与实现

    基于Python的网络中国象棋游戏设计与实现 摘要中国象棋是一种家喻户晓的棋类游戏,随着互联网时代的到来,人们的娱乐方式也逐渐向PC端和移动端上发展.本文将传统的中国象棋游戏和当下的互联网技术结合作为 ...

  8. python卡方检验筛选特征原理_基于Python的遥感特征筛选—递归特征消除(RFE)与极限树(Extra-Trees)...

    引言 基于前几篇文章关于筛选方法的介绍,本篇同样给大家介绍两种python封装的经典特征降维方法,递归特征消除(RFE)与极限树(Extra-Trees, ET).其中,RFE整合了两种不同的超参数, ...

  9. python图片识别验证码软件_基于python图片识别工具(图片识别,车牌,PDF,验证码)...

    先上图  不多说. 对于一般的用户来说识别率还是能达到百分之90以上. 已经打包成exe文件.windows用户可以直接使用.要软件的加我QQ python代码: # -*- coding: UTF- ...

  10. python实现ocr识别算法_基于Python的OCR实现示例

    摘要: 近几天在做一个东西,其中需要对图像中的文字进行识别,看了前辈们的文章,找到两个较简单的方法:使用python的pytesseract库和调用百度AI平台接口.写下这篇文章做一个比较简短的记录和 ...

最新文章

  1. 国家计算机科学进展,计算机科学技术学院部署科研工作推进及国家自然科学基金申报工作...
  2. Unity,UDK,Unreal Engine4或者CryENGINE——我应该选择哪一个游戏引擎
  3. 软件开发团队中,凭什么新手当道?| 畅言
  4. 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)(转)...
  5. 5个Linux 服务器发行版你值得拥有
  6. Away3D 的实体收集器流程2
  7. hdu3947 给一些已知(需费用)路径去覆盖一些边 //预先加灌法费用流
  8. flask服务器获取多个文件,python - OkHttp将带有名称的多个文件上传到Python Flask服务器 - 堆栈内存溢出...
  9. 欺骗的艺术from凯文•米特尼克
  10. 全球与中国服装测试、检验及认证市场深度研究分析报告
  11. 【BZOJ 2054】 疯狂的馒头
  12. Attributed Graph Clustering: A Deep Attentional Embedding Approach,IJCAI2019
  13. 接口测试流程是怎样的?
  14. 端到端与点到点到底是什么?
  15. gcc 内联汇编用法介绍
  16. unas基于_UNAS 2.0 Ushare Edition系统 NAS 软件 固件 收费版支持更新
  17. c++加减乘除计算器
  18. 云查杀:云安全不可或缺的安全组件
  19. 自媒体淘客选好爆文标题轻松月入过万
  20. 自制操作系统系列(四):进入64位模式

热门文章

  1. MaxCompute(ODPS)实现笛卡尔积
  2. oops和panic的区别
  3. 拖延症拖延的不想治怎么办!
  4. java快速排序quicksort
  5. 机器学习 - SVD分解算法的物理意义
  6. 风险管理系列课程二:利用图技术优化反洗钱解决方案
  7. 多功能扳手机械结构设计(设计资料)
  8. 万元内买断管理软件“全家桶”还“包定制”:SaaS新风向?
  9. 宝塔7.9最新企业版免授权无后门
  10. office安装文件