桶排序规则:
1.预先准备指定数量的桶来存放各个数据段的数据(可根据业务自行决定桶的数量);
2.计算出每个桶的大致数据区间(相当于计算平均数【(最大值-最小值) / 桶数量】);
3.创建一个二维数组,外层数组长度为桶数量;内层数组长度为平均数据区间;
4.遍历待排序数组,根据数据所在区间,将数据放到指定的桶中【(当前值-最小值) / 桶数量】;
5.遍历桶,对每一个桶中的数据进行排序;
6.输出排序后的结果;
适用场景: 适用于数组中的数据排布均匀的情况。否则会导致有些桶数据很少,而有些桶数据太多;
下面直接上代码:
/**
*
* @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]
以上,我们便得到了排序后的结果。