桶排序規則:java
1.預先準備指定數量的桶來存放各個數據段的數據(可根據業務自行決定桶的數量);數組
2.計算出每一個桶的大體數據區間(至關於計算平均數【(最大值-最小值) / 桶數量】);dom
3.建立一個二維數組,外層數組長度爲桶數量;內層數組長度爲平均數據區間;ide
4.遍歷待排序數組,根據數據所在區間,將數據放到指定的桶中【(當前值-最小值) / 桶數量】;ui
5.遍歷桶,對每個桶中的數據進行排序;code
6.輸出排序後的結果;排序
適用場景: 適用於數組中的數據排布均勻的狀況。不然會致使有些桶數據不多,而有些桶數據太多;get
下面直接上代碼:class
/** * * @author chengxp * @desc TODO */ public class Bucket { public static void entry(int[] arrTarget) { int min = arrTarget[0]; int max = arrTarget[0]; // 默認準備5個桶來裝填數據 int bucketCount = 5; int bucketSize = 0; for (int i = 0; i < arrTarget.length; i++) { if (min > arrTarget[i]) { min = arrTarget[i]; } if (max < arrTarget[i]) { max = arrTarget[i]; } } //計算出每一個桶的大小( + 1是爲了防止下標越界) bucketSize = ((max - min) / bucketCount) + 1; //建立一個與桶相同數量的二維數組; int[][] bucketArr = new int[bucketCount][bucketSize]; int[] bucket = new int[bucketSize]; int curBucketIndex = 0; int curData = 0; //把每一個數據按所在區間放入每個桶 for (int j = 0; j < arrTarget.length; j++) { curData = arrTarget[j]; //獲得當前桶位置 curBucketIndex = Double.valueOf((Math.floor((curData - min) / bucketSize))).intValue(); //獲得桶 bucket = bucketArr[curBucketIndex]; //查找到桶中最後一個空位,將數據放入這個空位 for(int k = 0;k < bucket.length;k++) { if(bucket[k] == 0) { bucket[k] = curData; break; } } } int count = 0; //對每個桶中的數據進行排序 for(int k = 0;k < bucketArr.length;k++) { bucket = bucketArr[k]; //這裏使用快速排序法 Quick.entry(bucket, 0, bucket.length - 1); //提取排序後的數據 for(int h = 0;h < bucket.length;h++) { if(bucket[h] > 0) { arrTarget[count++] = bucket[h]; } } } } public static void main(String[] args) { int[] arrTarget = DataProvider.getRandomArray(17); System.out.println("source arr" + Arrays.toString(arrTarget)); Bucket.entry(arrTarget); System.out.println("res arr" + Arrays.toString(arrTarget)); } }
輸出結果:遍歷
source arr[99, 96, 51, 4, 29, 56, 62, 90, 85, 71, 34, 10, 71, 58, 10, 81, 92]
res arr[4, 10, 10, 29, 34, 51, 56, 58, 62, 71, 71, 81, 85, 90, 92, 96, 99]
以上,咱們便獲得了排序後的結果。