1、概述:
桶排序是将数组的N个元素分到M个桶里,每个桶里多于一个元素的话再排序,排序可以使用桶排序或者其他排序方法。桶排序不是比较排序,所以它的时间复杂度不受O(n log n)为下限的影响。
桶排序的算法要求,要排序的数据长度必须完全一样。也就是数据的位数相同,一位都是一样,三位都是三位数。
2、分析:
桶排序的时间复杂度包括两个部分:
- 循环计算每个元素的桶映射函数,这部分是O(N)。
- 利用排序算法对每个桶内的数据进行排序,这部分是∑O(Ni*logNi),其中Ni为第i个桶中的元素个数。
第二部分决定了该排序的效率,因为比较排序的时间复杂度最低只能到O(N*logN),因此我们应当尽力做到以下两点:
- 映射函数f(x)能够将N个元素尽量平均分配到M个桶中。每个桶中就有[N/M]个元素了。
- 尽量增加桶的个数。极限情况下,每个桶只有一个元素,这样就不需要进行桶内的排序操作。
我们并不能无限的扩大桶的个数,所以桶排序的应用范围较窄。
3、算法描述:
假设有数组{32,17,99,20,54,78,32,29,21,70},利用桶排序进行升序排列。
- 数组中所有元素都是10<arr[i]<100的,我们设置10个桶,编号0~9,然后确定映射函数为f(i)=arr[i]/10,这样的话第一个关键字32将定位到第3个桶中,32/10=3。依次将所有的元素放入桶中。
- 对于单个桶中有多个元素的情况,比如,20,29,21都当在第2个桶中,对这个桶进行快速排序,这样桶中的元素就处理完成了。
- 所有桶内排序完成后,将元素顺序输出。
4、Java实现:
|
|