1. 桶排序:桶排序是基数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序( 有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排 )。
2. 桶排序的时间,空间复杂度及稳定性:
1>. 时间复杂度:O(n+m) 。
2>. 空间复杂度:O(n+m)。
3>. 稳定性:稳定。
3. 桶排序的实现:
//桶排序
/*
* 我们将数组中的数据分成多个桶 每个桶中可以存放不同范围的数据
* 并且桶存放的数据范围是依次递增的
* 将数组中的数据分别进桶
* 对每个桶中的数据进行排序 可以使用其他排序方法 也以再使用桶排序
* 再将每个桶中排序好的数据依次放入原数组中
* 桶的个数 以及 要将数据分入的桶的编号 都可以通过数组中的最大值 和 最小值来进行计算
*/
public class BucketSort {
public static void main(String[] args) {
int[] arr = {233, 53, 10, 7, 4, 69, 433, 53, 18, 100};
bucketSort(arr);
System.out.println(Arrays.toString(arr));
}
//对数组进行桶排序
private static void bucketSort(int[] arr) {
//1.获取数组中的最大值 和 最小值
int max = arr[0];
int min = arr[0];
for(int i = 0; i < arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
}else if(arr[i] < min) {
min = arr[i];
}
}
//2.获取桶的个数
int bucketNum = (max - min) / arr.length + 1;
//3.将每个桶创建出来 这里用ArrayList对象表示桶
LinkedList<Integer>[] list = new LinkedList[bucketNum];
for(int i = 0; i < list.length; i++) {
list[i] = new LinkedList<Integer>();
}
//4.将数组的数据分入对应索引的桶中
for(int i = 0; i < arr.length; i++) {
list[(arr[i] - min) / arr.length].add(arr[i]); //将原数组中的数据添加到指定编号的桶中
}
//5.对每个桶中的数据进行排序
for(int i = 0; i < list.length; i++) {
list[i].sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
}
//6.将每个桶中的数据依次放回原数组
int index = 0;
for(int i = 0; i < list.length; i++) {
for(int j = 0; j < list[i].size(); j++) {
arr[index++] = list[i].get(j);
}
}
}
}
4. 运行结果: