排序算法-桶排序(Java)
package com.rao.sort;
import java.util.*;
/**
* @author Srao
* @className BucketSort
* @date 2019/12/10 17:42
* @package com.rao.sort
* @Description 桶排序
*/
public class BucketSort {
/**
* 桶排序
* @param arr
* @return
*/
public static double[] bucketSort(double[] arr){
//1.计算出最大值和最小值,求出两者的差值
double min = arr[0];
double max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]){
max = arr[i];
}
if (arr[i] < min){
min = arr[i];
}
}
double d = max - min;
//2.初始化桶
int bucketNum = arr.length;
List<LinkedList<Double>> bucketList = new ArrayList<>(bucketNum);
for (int i = 0; i < bucketNum; i++) {
bucketList.add(new LinkedList<>());
}
//3.遍历数组中的元素,把所有元素都放入对应的桶当中
for (int i = 0; i < arr.length; i++) {
//计算当前元素应该放在哪个桶里面
int num = (int)((arr[i] - min) / (d / (bucketNum - 1)));
bucketList.get(num).add(arr[i]);
}
//4.对每个桶里面的元素进行排序
for (int i = 0; i < bucketNum; i++) {
Collections.sort(bucketList.get(i));
}
//5.输出全部元素
int k = 0;
for(LinkedList<Double> doubles : bucketList){
for (Double aDouble : doubles) {
arr[k] = aDouble;
k++;
}
}
return arr;
}
public static void main(String[] args) {
double[] arr = new double[]{4.12, 6.421, 0.0023, 3.0, 2.123, 8.122, 4.12, 10.09};
System.out.println(Arrays.toString(arr));
arr = bucketSort(arr);
System.out.println(Arrays.toString(arr));
}
}
桶排序可以看作是对计数排序的改进,计数排序对于数值在一定范围的整数数组可以进行排序,但是对于小数的数组却没有办法计数,这时候就要用到桶排序。
桶排序是将数组中的数划分到不同的区间,再对每个桶中的数进行排序,这时用的排序算法一般为快速排序或者归并排序,然后再把所有桶中的数返回给原数组。