桶排序算法是最簡單最快速的排序算法,今天我們先從最簡單的開始接觸算法,首先我們先看下代碼實現,然後根據結果再來對該算法進行分析:
public class BucketSort {
public static void main(String[] args) {
// 1.等待排序的數組
int[] waitNumbers = {3,15,8,13,6,35};
// 2.準備好空桶 (帶排序數字中最大的那個值+1)
int[] bucketNumbers = new int[36];
// 3.待排序的數字入桶
for (int i = 0; i < waitNumbers.length; i++) {
bucketNumbers[waitNumbers[i]] = waitNumbers[i];
}
// 4.從桶中取出排序後的結果
for (int i = 0; i < bucketNumbers.length; i++) {
if(bucketNumbers[i] > 0){
System.out.print(bucketNumbers[i]+" ");
}
}
}
}
結果:3 6 8 13 15 35
分析
待排序數字個數爲m;
桶的個數爲n;
待排序數字入桶遍歷m次;
從桶中取出值遍歷桶n次;
所以,時間複雜度爲m+n+m+n即O(m+n+m+n)=O(2*(m+n)),通常在計算時間複雜度時較小的常數可以忽略,所以桶排序的時間複雜度爲:O(M+N)。
優點:快速,簡單
缺點:消耗空間,比較耗內存(典型的以空間換時間),只能針對正整數排序;
應用場景:待排序的數數量不多時以及排序最大值不是特別大時比較適合,最大值太多會佔用太多的空桶(內存空間),例如,年級考試,比賽成績排名等;