桶排序规则: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]
以上,咱们便获得了排序后的结果。