七、桶排序(Bucket Sort)
要使桶排序正常運行,需要額外的信息:
輸入A1,A2,...,AN必須只由小於M的正整數構成,即Ai<M。使用一個大小為M的數組result,初始化為全0。數組有M個單元,即M個桶(bucket)。 1 void bucketSort(vector<int> &a, const int maxVal 2 {
3 //int result[maxVal] = { 0 }; 4 /* 初始化桶 */ 5 for (int i = 0; i < maxVal; i++) 6 { 7 result[i] = 0; 8 } 9 /* 讀入數據裝桶 */ 10 for (int i = 0; i < a.size(); i++) 11 { 12 result[a[i]]++; 13 } 14 /* 將桶中的每個數打印出來,出現幾次就打印幾次 */ 15 for (int i = 0; i < maxVal; i++)
16 for (int j = 0; j < result[i]; j++) 17 { 18 cout << i << endl; 19 }
20 }
步驟:
result[Ai]中存放的是Ai出現的次數;
讀入Ai時,result[Ai]增1;
所有輸入數據讀入后,掃描數組result,打印出排序后的數據,result[Ai]值是n,Ai就打印n次.
eg.
輸入數組{1,4,5,3,7,8,4,9,6,5,0},最大為9,另建一個大小為10的數組,初始化為全0。
讀入數組:
遇到1,將result[1]加1
遇到4,將result[4]加1
......
遇到5,將result[5]加1
遇到0,將result[0]加1
得到結果:
打印結果:
0 1 3 4 4 5 5 6 7 8 9
時間復雜度:
算法用時O(M+N),M為桶的個數,N為待排序數組的大小。
空間復雜度:
O(M+N)
如果輸入數據非常龐大,桶的數量會非常多,空間代價將會非常大。