桶排序

算法思想:

將陣列分到有限數量的桶子裏。每個桶子再個別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排序)。桶排序是鴿巢排序的一種歸納結果。

當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間(Θ(n))。但桶排序並不是比較排序,則不受到 O(n log n) 下限的影響。

簡單來說,就是把數據分組,放在一個個的桶中,然後對每個桶裏面的在進行排序。

例如要對大小爲[1..1000]範圍內的n個整數A[1..n]排序

首先,可以把桶設爲大小爲10的範圍。具體而言,設集合B[1]存儲[1..10]的整數,集合B[2]存儲(10..20]的整數,……集合B[i]存儲( (i-1)*10, i*10]的整數,i=1,2,..100。總共有100個桶。

然後,對A[1..n]從頭到尾掃描一遍,把每個A[i]放入對應的桶B[j]中。再對這100個桶中每個桶裏的數字排序,這時可用冒泡、選擇乃至快排,一般來說任何排序法都可以。

最後,依次輸出每個桶裏面的數字,且每個桶中的數字從小到大輸出,這樣就得到所有數字排好序的一個序列了。

假設有n個數字,有m個桶,如果數字是平均分佈的,則每個桶裏面平均有n/m個數字。如果對每個桶中的數字採用快速排序,那麼整個算法的複雜度是:
O(n+m * (n/m)*log(n/m)) = O(n + nlogn – nlogm)

從上式看出,當m接近n的時候,桶排序複雜度接近O(n)

當然,以上複雜度的計算是基於輸入的n個數字是平均分佈這個假設的。這個假設是很強的,實際應用中效果並沒有這麼好。如果所有的數字都落在同一個桶中,那就退化成一般的排序了。

前面說的幾大排序算法,大部分時間複雜度都是O(n2),也有部分排序算法時間複雜度是O(nlogn)。而桶式排序卻能實現O(n)的時間複雜度。但桶排序的缺點是:

1)首先是空間複雜度比較高,需要的額外開銷大。排序有兩個數組的空間開銷,一個存放待排序數組,一個就是所謂的桶,比如待排序值是從0到m-1,那就需要m個桶,這個桶數組就要至少m個空間。

2)其次待排序的元素都要在一定的範圍內等等。

發佈了23 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章