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:合桶的次数

    算法稳定性:

    稳定

  • 相关阅读:
    假期实践
    每周更新学习进度表
    作业三
    作业一
    作业二
    真实感海洋的绘制(一):基于统计学模型的水面模拟方法
    递推方程的求解
    真实感海洋的绘制(二):使用快速傅里叶变换加速波形计算
    "Mathematical Analysis of Algorithms" 阅读心得
    HTML2
  • 原文地址:https://www.cnblogs.com/King-Tong/p/12534445.html
Copyright © 2011-2022 走看看