• 20191106-基于Python的对字母基数排序


    基数排序

    概念

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

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

    基数排序分类

    基数排序的方式分为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])表示先比较最后一位,再比较倒数第二位,倒数第三位。。。

     原文参考:

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

  • 相关阅读:
    SPOJ1043 GSS1(线段树)
    cf1028C. Rectangles(前缀和)
    cf559C. Gerald and Giant Chess(容斥原理)
    五校联考解题报告
    BZOJ1853: [Scoi2010]幸运数字(容斥原理)
    使用spring-amqp结合使用rabbitmq
    instanceof关键字
    qml学习:对象和属性
    [置顶] 推荐12款很棒的HTML5开发框架和开发工具
    linux系统开机过程描述
  • 原文地址:https://www.cnblogs.com/hyj691001/p/11808462.html
Copyright © 2020-2023  润新知