python实现基数排序(MSD和LSD)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值