桶排序算法是最简单最快速的排序算法,今天我们先从最简单的开始接触算法,首先我们先看下代码实现,然后根据结果再来对该算法进行分析:
public class BucketSort {
public static void main(String[] args) {
// 1.等待排序的数组
int[] waitNumbers = {3,15,8,13,6,35};
// 2.准备好空桶 (带排序数字中最大的那个值+1)
int[] bucketNumbers = new int[36];
// 3.待排序的数字入桶
for (int i = 0; i < waitNumbers.length; i++) {
bucketNumbers[waitNumbers[i]] = waitNumbers[i];
}
// 4.从桶中取出排序后的结果
for (int i = 0; i < bucketNumbers.length; i++) {
if(bucketNumbers[i] > 0){
System.out.print(bucketNumbers[i]+" ");
}
}
}
}
结果:3 6 8 13 15 35
分析
待排序数字个数为m;
桶的个数为n;
待排序数字入桶遍历m次;
从桶中取出值遍历桶n次;
所以,时间复杂度为m+n+m+n即O(m+n+m+n)=O(2*(m+n)),通常在计算时间复杂度时较小的常数可以忽略,所以桶排序的时间复杂度为:O(M+N)。
优点:快速,简单
缺点:消耗空间,比较耗内存(典型的以空间换时间),只能针对正整数排序;
应用场景:待排序的数数量不多时以及排序最大值不是特别大时比较适合,最大值太多会占用太多的空桶(内存空间),例如,年级考试,比赛成绩排名等;