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)); } }
桶排序能夠看做是對計數排序的改進,計數排序對於數值在必定範圍的整數數組能夠進行排序,可是對於小數的數組卻沒有辦法計數,這時候就要用到桶排序。java
桶排序是將數組中的數劃分到不一樣的區間,再對每一個桶中的數進行排序,這時用的排序算法通常爲快速排序或者歸併排序,而後再把全部桶中的數返回給原數組。算法