zoukankan      html  css  js  c++  java
  • 基数排序radix sort

    原理:

    基数排序是一种只适用于数字或者字母的排序方式,不具有普适性。分为低位优先(LSD Least Significant Digital)和高位优先(MSD Most Significant Digital)。低位优先就是从元素的最右边开始,先从最低位开始分桶并放入对应的桶中,桶的个数和编号与数字和字母个数对应。之后合并第一次的分桶结果。以此,直到所有位数都分桶并合并完成。最后返回数组,就是有序态。注意:分桶的次数由数组中最长的元素决定。当排序字母时,如果其中有元素长度小于该组的最长长度,则默认将该元素放入第一个桶也就是字母a桶,可以理解为将元素用a补齐。如最长的单词为lucky 最短的则为boy”aa”。

    不能排序负数和正数混合的情况。

    数字LSD

    1.依据个位数分桶,在合并各个桶

    2.按照十位数字分桶,再合并

    arr=[1,10,3,2,30,8,2,0]

    def redix_sort(arr):

        #最大的数字的长度决定了分桶合并的次数

        loop_times=len(str(max(arr)))

        for i in range(loop_times):

            bucket=[[] for i in range(10)]

            for num in arr:

                digit=num //10**i%10     #取每一位上的数字

                bucket[digit].append(num)

            arr=[]

            print("b",bucket)

            for child_arr in bucket:

                arr+=child_arr

        return arr

    print(redix_sort(arr))

    字母,字典序LSD

    arr = ["banana","apple","orange","ape","he","application","bat","object","able"]

    def radix_sort_word(arr):

        max_length=len(max(arr,key=len))

        while max_length>0:

            bucket=[[] for i in range(26)]

            for word in arr:

                if len(word)>=max_length:

                    bucket[ord(word[max_length-1])-97].append(word)

                else:

                    bucket[0].append(word)

            arr=[]

            for child_bucket in bucket:

                arr+=child_bucket

            max_length-=1

        return arr

    print(radix_sort_word())

    时间复杂度和稳定性:

    时间复杂度:

    O(d(n+r))

    d:执行分桶操作的次数

    n:有多少数字要进行排序

    r:合桶的次数

    算法稳定性:

    稳定

  • 相关阅读:
    湘潭大学 Hurry Up 三分,求凹函数的最小值问题
    hdu 1166 线段树 单点修改 + 询问区间求和 (线段树模板)
    hdu 1166 树状数组(模板) 更改点值+求区间和
    getline
    poj 1873 The Fortified Forest 凸包+位运算枚举 world final 水题
    C# 代码操作XML(增、删、改)
    C# Socket服务端与客户端通信(包含大文件的断点传输)
    MD5 十六进制加密
    C# 面向对象——多态
    C# 面向对象——继承
  • 原文地址:https://www.cnblogs.com/King-Tong/p/12534445.html
Copyright © 2011-2022 走看看