算法导论笔记——水桶排序(基数排序)
来源:互联网 发布:python 数组拆分 编辑:程序博客网 时间:2024/06/07 18:07
这次是计数排序的升级版,若是计数排序还没有搞懂,先去看看我的前一篇。
计数排序是用空间换时间的算法,若k太大,它的效率会下降很快,而且会消耗很多内存,所以通常是在重复的元素很多,且跳跃不太大的情况下使用。废话不多先上代码:
import mathdef 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))
网上找了很多桶子排序代码,发现很多效率都不尽人意,不但慢于快速排序,甚至与普通插入排序都差不多了。
参考麻省理工算法导论公开课,使用二进制分桶,使用计数排序实现底层排序,大大加快了效率。
0 0
- 算法导论笔记——水桶排序(基数排序)
- 算法导论学习笔记——基数排序
- 算法导论学习笔记(六):计数排序与基数排序
- MIT:算法导论——5.线性时间排序:计数排序、基数排序以及桶排序
- 【算法导论】第五课 线性排序(基数排序 计数排序)
- 算法导论(3) 快速排序、计数排序、基数排序
- 《算法导论》学习心得(七)—— 基数排序
- 算法导论第八章——基数排序
- 算法导论例程——基数排序
- 排序算法(八)——基数排序
- 排序算法(八)——基数排序
- 排序算法(八)——基数排序
- 算法导论笔记——快速排序
- 算法导论笔记——插入排序
- 算法导论笔记——归并排序
- 算法导论笔记——计数排序
- 算法导论笔记——堆排序
- 排序算法——基数排序
- 第16周项目2-大数据集上排序算法性能的体验
- PC端CSS样式重置
- vim编辑器重新打开文本,回到上次编辑的位置
- iOS绘图相关
- 安卓开发百度地图需要注意的问题
- 算法导论笔记——水桶排序(基数排序)
- 关于rman增量备份
- 常见的八种导致 APP 内存泄漏的问题
- Windows控件消息反射
- UML---4+1视图
- 编译原理 LL1文法的判断和句子识别
- webstrom 获取注册码地址
- 实现一个函数翻转字符串(将一个字符串的内容,逆序存储)
- Android 常用RGB值及中英文名称