import numpy as np
class Radix_Sort():
def __init__(self):
#1,测试基数排序LSD代码
self.A=[15,189,42,3,3]
self.Radix_Sort_LSD()
print(self.A)
#2,测试基数排序MSD代码
self.A=[15,189,42,3,3]
print(self.Radix_Sort_MSD(self.A))
def count_sort_LSD(self, A, exp):
c=np.zeros(10,dtype=int)
B=np.zeros(len(A),dtype=int)
for i in A:
c[int(i/exp)%10]+=1
for i in range(1,len(c)):
c[i]+=c[i-1]
for i in A[::-1]:
B[c[int(i/exp)%10]-1]=i
c[int(i/exp)%10]-=1
return B
def count_sort_MSD(self,A,exp):
c=np.zeros(10,dtype=int)
B=np.zeros(len(A),dtype=int)
for i in A:
c[int(i/exp)%10]+=1
d=c.copy()
for i in range(1,len(c)):
c[i]+=c[i-1]
for i in A[::-1]:
B[c[int(i/exp)%10]-1]=i
c[int(i/exp)%10]-=1
return B,d
def Radix_Sort_LSD(self):
max_=np.max(self.A)
exp=1
while int(max_/exp)>0:
self.A=self.count_sort_LSD(self.A, exp)
exp*=10
def Radix_Sort_MSD(self,A,exp=None):
max_=np.max(A)
if exp==None:
exp=1
while int(max_/exp)>0:
exp*=10
exp/=10
A,d=self.count_sort_MSD(A, exp)
if exp==1:
return A
l=[]
k=0
for i in d:
if i>1:
l.extend(self.Radix_Sort_MSD(A[k:k+i], exp/10))
elif i==1:
l.append(A[k])
k+=i
return l
Radix_Sort()
解释:
1)上述代码可以直接运行出结果
2)其中count_sort_MSD和count_sort_LSD分别是MSD和LSD基数排序条件下用的计数排序,区别就是MSD条件下将c数组复制了一个用来检测每个桶c[i]中有多少个数,如果超过1个在MSD中就需要用递归解决
3)很简单的。如果对你有帮助就点个赞吧!hhhhh