1、基本思想
划分多个范围相同的区间,每个自区间自排序,最后合并。
桶排序是计数排序的扩展版本,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素,通过映射函数,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原序列中。
桶排序需要尽量保证元素分散均匀,否则当所有数据集中在同一个桶中时,桶排序失效。
不同的桶排序原理一样,主要区别于桶里面的排序类型
2、动画演示3、代码演示
package sort;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class BucketSort {
public static void main(String[] args) {
int[] arr = { 2, 4, 3, 1, 6, 7, 5, 9, 8 };
bucketSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void bucketSort(int[] arr) {
//计算最大值与最小值
int max=arr[0];
int min=arr[0];
for(int i=0;i<arr.length;i++){
max=Math.max(max, arr[i]);
min=Math.min(min, arr[i]);
}
//计算桶的数量
int bucketNum=(max-min)/arr.length+1;
//桶是一个数组,数组里面存的类型依然是数组
ArrayList<ArrayList<Integer>> bucketArr=new ArrayList<>(bucketNum);
//遍历桶,对每个桶加数组
for(int i=0;i<bucketNum;i++){
bucketArr.add(new ArrayList<Integer>());
}
//黄内阁天涯不属于放入桶里
for(int i=0;i<arr.length;i++){
//计算出元素对应的桶序号
int num=(arr[i]-min)/arr.length;
bucketArr.get(num).add(arr[i]);
}
//对每个桶进行排序
for(int i=0;i<bucketArr.size();i++){
Collections.sort(bucketArr.get(i));
}
//将桶中的元素赋值给原序列
int index=0;
//遍历桶数组
for(int i=0;i<bucketArr.size();i++){
//遍历每个桶里面的数组
for(int j=0;j<bucketArr.get(i).size();j++){
//进行赋值
arr[index++]=bucketArr.get(i).get(j);
}
}
}
}
来源:CSDN
作者:小黄学程序
链接:https://blog.csdn.net/weixin_44716359/article/details/103871121