这次是计数排序的升级版,若是计数排序还没有搞懂,先去看看我的前一篇。
计数排序是用空间换时间的算法,若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<>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))
网上找了很多桶子排序代码,发现很多效率都不尽人意,不但慢于快速排序,甚至与普通插入排序都差不多了。
参考麻省理工算法导论公开课,使用二进制分桶,使用计数排序实现底层排序,大大加快了效率。
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- 分析COMP122 The Caesar Cipher
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)