排序算法-桶排序-java

 桶排序规则: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]

以上,咱们便获得了排序后的结果。

相关文章
相关标签/搜索