基数排序

概念

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

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

基数排序分类

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

  1. LSD(Least significant digital):LSD的排序方式由键值的最右边开始,先比较最低位,也就是个位,进行分桶,分桶过程中分到一个桶中的数据直接追加到桶中即可,无需排序。然后将所有同种的元素按桶的顺序拿出,重新组成序列,然后比较十位,进行分桶…直到比较到最高位,重新组成序列即可完成排序。
  2. MSD(Most significant digital):由键值的最左边开始,先比较最高位,最高位分到一个桶中的,再按照第二位进行分桶…,知道分到最后一位,然后再从最小的桶中逐层向上,把元素都拿出来,即完成排序。

算法过程

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

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

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

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

代码

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

#根据给定英文字母获取对应的桶的索引
def getBucketIndex(word,idx):
    if idx>=len(word):
        return 0
    letter = word[idx]
    if letter>="A" and letter<="Z":
        # 第一个字母从第buckets的第1个索引开始存储
       
return ord(letter)-ord("A")+1
    elif letter>="a" and letter<="z":
        return ord(letter)-ord("a")+1

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

# 遍历待排列表,进行排序
def bucketSort(arr):
    # 获取最长单词的长度,即排序的轮数
   
sort_round = len(max(arr, key=len))
    #将arr中的单词逐一取出,放入对应的bucket中
   
for i in range(sort_round-1,-1,-1):
        # 创建一个长度为27的桶,第0个位置存储非字母的元素,其他的存储26字母
       
buckets = [[] for i in range(27)]
        for word in arr:
            buckets_idx =
getBucketIndex(word,i)
            # print(buckets_idx)
           
buckets[buckets_idx].append(word)
    #将桶中的单词按照排序后顺序逐一放回arr中
       
idx = 0
        for bucket in buckets:
            for word in bucket:
                arr[idx] = word
                idx+=1
    return arr
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 = {}
for i in range(len(arr)):
    word = arr[i]
    if len(word)<sort_round:
        word+="0"*(sort_round-len(word))
    map_dic[word] = arr[i]
    arr[i] = word
print(arr)
# 从低位开始进行比较,排序
for i in range(sort_round):
    temp = [0]*len(arr)
    arr.sort(key=lambda x:x[-1-i])
result = [map_dic[key] for key in arr]
print(result)

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

原文参考:

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

20191106-基于Python的对字母基数排序的更多相关文章

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

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  2. selenium2自动化测试实战--基于Python语言

    自动化测试基础 一. 软件测试分类 1.1 根据项目流程阶段划分软件测试 1.1.1 单元测试 单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程. 1.1.2 集成测试 ...

  3. 从0开始学正则表达式-基于python

    关于正则表达式,当我们了解它就不难,不了解就很难,其实任何事情都是这样,没有人一生下来就啥都会,说白了,每个人都是一个学习了解进步的过程.学习和掌握正则表达式可能并不是太简单,因为它确实是有点像“外星 ...

  4. ATOMac - 基于Python的Mac应用Ui自动化库

    ATOMacTest 一.缘 起 近期工作需要对一款Mac端应用实现常用功能的自动化操作,同事推荐ATOMac这款工具,这几天简单研究了下,同时也发现现网介绍ATOMac的资料非常有限,故在此记录下A ...

  5. 【Machine Learning】决策树案例:基于python的商品购买能力预测系统

    决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本 ...

  6. 基于Python+Django的Kubernetes集群管理平台

    ➠更多技术干货请戳:听云博客 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调 ...

  7. 关于《selenium2自动测试实战--基于Python语言》

    关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...

  8. psutil一个基于python的跨平台系统信息跟踪模块

    受益于这个模块的帮助,在这里我推荐一手. https://pythonhosted.org/psutil/#processes psutil是一个基于python的跨平台系统信息监视模块.在pytho ...

  9. 一次完整的自动化登录测试-基于python+selenium进行cnblog的自动化登录测试

    Web登录测试是很常见的测试!手动测试大家再熟悉不过了,那如何进行自动化登录测试呢!本文作者就用python+selenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动 ...

随机推荐

  1. VS2008下LibTomCrypt 1.17的编译和使用《转》

    文章出处:http://blog.csdn.net/delphiwcdj/article/details/6298820 具体步骤如下: (1) 下载tomcrypt tomcrypt 1.17 VS ...

  2. RK3399 pro 开发记录

    RK3399有三种启动模式:1.Normal模式:2.Loader模式:3.MaskRom模式.      Normal模式是正常的启动过程,各个组件依次加载,直到正常进入系统.      Loade ...

  3. super与this的用法

    1 super和this都是调用其他的构造方法 super放在构造方法的第一条语句,调用父类的某种构造方法,如果没有super语句,会默认调用父类中无参的构造方法,如果父类构造方法指明而且都有参数,子 ...

  4. Code Quality and Security | SonarQube

    SonarQube - 国内版 Binghttps://cn.bing.com/search?FORM=U227DF&PC=U227&q=SonarQube Code Quality ...

  5. JS-SDK相关参考

    原文: https://www.cnblogs.com/wuhuacong/p/5482848.html https://www.cnblogs.com/29boke/p/5483599.html

  6. AndoridSQLite数据库开发基础教程(10)

    AndoridSQLite数据库开发基础教程(10) 添加触发器 触发器(TRIGGER)是由事件来触发某个操作.这些事件包括INSERT.DELETE.UPDATE和UPDATE OF.当数据库系统 ...

  7. shell脚本将gbk文件转化为utf-8

    使用注意项: 原来文件格式gbk的,否则可能出现utf-8转utf-8乱码. #!/bin/bash function gbk2utf(){ file="$1" echo &quo ...

  8. Vue非父子组件传值

    <template> <div id="app"> <v-home></v-home> <br> <hr> ...

  9. ISO/IEC 9899:2011 条款6.9——外部定义

    6.9 外部定义 语法 1.translation-unit: external-declaration translation-unit    external-declaration extern ...

  10. ES6深入浅出-3 三个点运算 & 新版字符串-2. 新版字符串

    这是以前的字符串..双引号,单引号.毫无区别 有时候在字符串里面写一些标签. 排版不好看 我就想回车一下.这样写虽然是好看.但是语法就报错了.es5的字符串不支持换行.我只想是想让它排版的好看一点. ...