不基於比較的排序
桶排序思想下的排序:計數排序&基數排序
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 + " ");
}
}
}