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

 

算法稳定性:

稳定

 

posted @ 2020-03-20 20:05  とうさん  阅读(163)  评论(0编辑  收藏  举报