基数排序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:合桶的次数
算法稳定性:
稳定