本篇为经典排序开篇故在此说一下排序的定义
所谓排序即将一组对象按照某种逻辑顺序重新排列的过程
---------格叽格叽-------------
太长不看版:
1、速度快
2、耗空间
3、稳定
先举个例子:班级里有五个同学在一次考试中分别考了3、2、7、5、1分(满分十分)
现在要按照从低到高的顺序名。桶排序顾名思义当然要有桶,因为满分是十分所以需要0~10共11个桶。桶准备好了现在就根据得分把这几个同学扔到对应分数的桶里。
放好以后从第一个桶开始把人依次取出来站好队,这样队伍顺序就是按照分数又低到高的排序了,没见过分数从低到高排的?倒过来抓人就好了!
代码如下图(bucket sort img01):
现在可以发现三个特点:一是待排序对象的数量有限,二是需要穷举对象所有的类型(桶)占空间,第三排序的步骤不受待排序对象初始状态的影响所以稳定。
以上只是简单的思想,还有诸多细节需要考虑,如分数会有重复的、分数可能是会有小数的。实际使用中不是只对数字排序的对象会有许多属性如何按照多属性排序?
现在来了一个插班生考了7分,这怎么办?7号桶里塞两个就好了...
代码中的遍历方法也需要改动一下,在原基础上加上对桶数量的遍历完整代码如下(bucket sort img03):
目前还只是简版的桶排序,下面说一下同一桶中对象的排序(多字段排序),比如说先按分数排分数相同的安装名字的首字母字典排序(abcd...)。当然同一桶中的对象可以根据具体情况使用其它合适的排序算法如冒泡排序。
简单借助list进行处理,此处根据id排序。代码如下(bucket sort img04):
参考书籍:
1、《啊哈!算法》
2、《算法》(第四版)