桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:
在额外空间充足的情况下,尽量增大桶的数量
使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中,数据范围在桶范围内。
同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
1. 什么时候最快
当输入的数据可以均匀的分配到每一个桶中。
2. 什么时候最慢
当输入的数据被分配到了同一个桶中。
3.桶排序思想
让全量的排序变成局部的排序,降低比较次数
4. 示意图
元素分布在桶中:
![](https://i-blog.csdnimg.cn/blog_migrate/2383cf8b40ff3dfd02a286b36d7934d3.png)
然后,元素在每个桶中排序:
![](https://i-blog.csdnimg.cn/blog_migrate/b91473e3fb9d198afd0c825752b3fc82.png)
代码实现
package com.xg;
import java.util.Arrays;
public class BucketSort {
public static void main(String[] args) {
int[] array = {1,1,1,1,1,1,1,1,0,1,2,3,5,4,9,7,8,6,10};
//bucketSort(array);
//1、找最大值
int maxNum = Integer.MIN_VALUE;
for(int i=0;i<array.length;i++) {
if(array[i]>maxNum) {
maxNum = array[i];
}
}
//2、创建桶(范围是 max+1,应为数组从0开始)
int[] bucketArray = new int[maxNum+1];
//3、数据和桶编号做映射,如果映射关系成立,给桶标记
for(int i=0;i<array.length;i++) {
int num = array[i];
//4、如果有桶映射有数据给桶编号+1标志,相同的数累加1
bucketArray[num]=bucketArray[num]+1;
}
//5、遍历桶
int n = 0;
for (int i=0;i<bucketArray.length;i++) {
//每个桶有bucketNum个数
int bucketNum = bucketArray[i];
//标记一个桶有多少个元素
for(int k = 0 ;k<bucketNum;k++) {
//array的第n个元素=第N个桶,桶内元素第n个
array[n++] = i;
}
}
System.out.println(Arrays.toString(array));
}
}