排序算法-桶排序-java

 桶排序规则:

 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]

以上,我们便得到了排序后的结果。

转载于:https://my.oschina.net/u/4122740/blog/3046260

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值