排序算法-桶排序-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]

以上,咱們便獲得了排序後的結果。

相關文章
相關標籤/搜索