排序算法-計數排序-java

 * 計數排序
 * 排序流程:
    1.找出源數組中的最小值;
    2.找出源數組中的最大值;
    3.建立=最大值+1長度的新數組;
    4.在新數組中循環從最小值開始;
    5.再次循環源數組,直接將值做爲新數組的下標;
    6.相同的數字,出現一次,就在對應的下標位置上+1;
    7.遍歷新數組,新數組中下標值爲0的跳過,有值的直接的輸出當前下標(當前下標即是須要排序的數字);
    8.下標的值爲X,就輸出X次。
    9.依次放入最終的結果集數組中。
  * 適用場景:
    適用於數據範圍相對較小的狀況。若範圍太大,須要建立一個很長的數組來裝填,就浪費了不少空間;java

    排序代碼以下,直接運行看結果吧,比較簡單,就不必贅述了。數組

/**
 * 計數排序
 * @author chengxp
 */
public class Counting {

	/**
	 * 排序入口
	 * 
	 * @param arr
	 */
	public static void entry(int[] arr) {

		int min = arr[0];
		int max = arr[0];

		for (int i = 1; i < arr.length; i++) {

			//找出最小值
			if (min > arr[i]) {

				min = arr[i];
			}

			//找出最大值
			if (max < arr[i]) {

				max = arr[i];
			}
		}
		System.out.println("min value:" + min);
		System.out.println("max value:" + max);

		// 構建一個新的數組,把原數組中數據的值看成下標存入,下標從0開始;由於max要放入對應下標中,因此要+1
		int[] bucketArr = new int[max + 1];
		for (int k = 0; k < arr.length; k++) {

			//數字每出現一次,就在原基礎上+1
			bucketArr[arr[k]] = bucketArr[arr[k]] + 1;
		}

		//輸出最終結果
		int finalIndex = 0;
		for (int h = min; h < bucketArr.length; h++) {

			if (bucketArr[h] > 0) {

				//下標爲l,就表明有l個數字
				for (int l = 0; l < bucketArr[h]; l++) {
					
					arr[finalIndex++] = h;
				}
			}
		}
	}

	public static void main(String[] args) {

		int[] arr = DataProvider.getRandomArray(13);
		System.out.println("source arr:" + Arrays.toString(arr));

		Counting.entry(arr);
		System.out.println("res arr:" + Arrays.toString(arr));
	}
}

輸出結果:dom

source arr:[87, 62, 75, 20, 78, 0, 24, 21, 33, 31, 81, 15, 20]
min value:0
max value:87
res arr:[0, 15, 20, 20, 21, 24, 31, 33, 62, 75, 78, 81, 87]ide

相關文章
相關標籤/搜索