目录
一、计数排序
假设4,3,2,2,6,7
1.一次遍历找到max=7,min=2;
2.计算要创建的桶大小为:max-min+1,并创建桶;
3.第二次遍历,将值存进通中,每个下标对应2~7的第几位,值为这个位出现的次数;
4.从头到尾输出,如果次数=0,不输出。为1,输出一次。>1,输出多次。
public List<Integer> countOrder(int [] arr){
ArrayList<Integer> res = new ArrayList<>();
if (arr.length==0||arr==null)return res;
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
//1.一次遍历查找最大和最小值
for (int i=0;i<arr.length;i++){
min = Math.min(arr[i],min);
max = Math.max(arr[i],max);
}
//2.新建大小为len的桶数组
int len = max-min+1;
int [] bucket = new int[len];
//3.第二次遍历,将值存进桶中
//注:桶的下标包包含了元素值,内容包含元素个数
for (int i=0;i<arr.length;i++){
bucket[arr[i]-min]++;
}
//4.最后将桶中元素按顺序输出
for (int i=0;i<bucket.length;i++){
for (int count = bucket[i];count>0;count--){
res.add(i+min);
}
}
return res;
}
二、桶排序
假设:4,5,2,3,17,22
1.计算max=22 , min=2
2.桶数=(max-min)/len + 1 = 3;
->每个桶能容纳的个数=len=7;
3.将数组中元素存入桶
->当前元素应存入第(val-min)/len个桶中
4.对每个桶进行排序
5.按照顺序拼接和输出
public List<Integer> bucketSort(int[] arr){
ArrayList<Integer> res = new ArrayList<>();
if (arr.length==0||arr==null)return res;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
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));
//添加到结果
for (int a:bucketArr.get(i)){
res.add(a);
}
}
return res;
}