複習資料結構:排序演算法(七)——桶排序

bigface1234fdfg發表於2015-02-25

    

    桶排序是一種穩定的排序方法,也是一種外排序。


    桶排序的時間複雜度:最壞情況執行時間:當分佈不均勻時,全部元素都分到一個桶中,則O(n^2),當然[演算法導論8.4-2]也可以將插入排序換成堆排序、快速排序等,這樣最壞情況就是O(nlgn)。最好情況執行時間:O(n)。

    也就說,前面介紹的排序演算法要麼是O(n^2),要麼是O(nlogn),只有桶排序是可能實現O(n)排序的,但是對資料是有要求的。


    基本思想:是將陣列分到有限數量的桶子裡。每個桶子再個別排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序)。桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間(Θ(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)其次待排序的元素都要在一定的範圍內等等。

桶式排序是一種分配排序。分配排序的特定是不需要進行關鍵碼的比較,但前提是要知道待排序列的一些具體情況。



參考連結:

http://blog.csdn.net/hguisu/article/details/7776068

http://blog.csdn.net/xiazdong/article/details/8462393

http://blog.csdn.net/houapple/article/details/6480100



相關文章