數據結構與算法(JAVA版)5_3:桶排序思想的排序Part1:計數排序

不基於比較的排序
桶排序思想下的排序:計數排序&基數排序
1)桶排序思想下的排序都是不基於比較的排序
2)時間複雜度O(N),額外空間複雜度O(M)
3)應用範圍有限,需要樣本的數據狀況滿足桶的劃分
計數排序的要求:樣本是整數、且範圍比較窄
基數排序的要求:樣本是10進制的正整數
一旦要求稍有升級,改寫代價增加是顯而易見的

package com.inspire.chapter5;

public class CountSort {

	// 計數排序:時間複雜度O(N) 思想:桶排序
	// 使用計數排序的前提條件:數據範圍要小
	// 所有基於桶排序思想的排序都對數據狀況本身有要求
	public static void main(String[] args) {
		int[] arr = { 150, 169, 200, 56, 0, 89, 45, 65, 89, 65, 65, 169 };
		countSort(arr);
		printf(arr);
	}

	private static void countSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		// 1.找出數組中的最大值
		int max = arr[0];
		for (int i = 1; i < arr.length; i++) {
			max = Math.max(max, arr[i]);
		}
		// 2.建立桶數組
		int[] bucket = new int[max + 1];// 假如max=9,則bucket的length必須是10,這樣bucket的最大下標纔會是9
		for (int i = 0; i < arr.length; i++) {
			bucket[arr[i]]++;
		}
		int i = 0;
		for (int j = 0; j < bucket.length; j++) {
			while (bucket[j]-- > 0) {
				arr[i++] = j;
			}
		}
	}

	private static void printf(int[] arr) {
		for (int i : arr) {
			System.out.print(i + " ");
		}
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章