算法导论笔记——水桶排序(基数排序)

这次是计数排序的升级版,若是计数排序还没有搞懂,先去看看我的前一篇。
计数排序是用空间换时间的算法,若k太大,它的效率会下降很快,而且会消耗很多内存,所以通常是在重复的元素很多,且跳跃不太大的情况下使用。废话不多先上代码:

import math
def bucketsort(A,maxValue):
    #采用二进制分组,比10进制分组更精确
    #step1 得到maxValue的二进制位数
    nstr = bin(maxValue)
    count = len(nstr)-2
    #step2 取得最佳桶容量r,当r = lgn时效率最快
    r = int(math.log(count,2))
    #获得分组二进制位数
    boost = count/r
    #step3 得到掩码
    b2 = boost
    andn = 0
    while b2:
        b2-=1
        andn += 1<<b2
    print '掩码: ' + str(bin(andn))
    print '掩码10进制: '+str(andn)
    #step3 分桶排序
    #分成r桶每桶用计数排序,把下面代码可以写成函数
    #注意这里分成r+1因为可能会余出几位,把余出来的当作一桶
    for index in range(0,r+1):
        #计算掩码,每次只排序掩码部分的值
        pullcount = index * boost
        #计数排序部分
        C = []
        B = []
        k = andn+1
        for i in range(0,k):
            C.append(0)
        for af in A:
            #把用过的部分移除
            a = af>>pullcount
            #使用掩码屏蔽多余的位数
            a &= andn 
            C[a]+=1
            B.append(0)
        for i in range(1,k):
            C[i]+=C[i-1]
        for jk in reversed(A):
            #和上面同理
            j = jk>>pullcount
            j &= andn
            B[C[j]-1] = jk
            C[j]-=1
        A = B
    return A

效率O((bn)/(lgn))
网上找了很多桶子排序代码,发现很多效率都不尽人意,不但慢于快速排序,甚至与普通插入排序都差不多了。
参考麻省理工算法导论公开课,使用二进制分桶,使用计数排序实现底层排序,大大加快了效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值