桶排序是一種穩定的排序方法,也是一種外排序。
也就說,前面介紹的排序演算法要麼是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)其次待排序的元素都要在一定的範圍內等等。
桶式排序是一種分配排序。分配排序的特定是不需要進行關鍵碼的比較,但前提是要知道待排序列的一些具體情況。
小白必學排序演算法(七) 桶排序
桶排序是計數排序的公升級版。它利用了函式的對映關係,高效與否的關鍵就在於這個對映函式的確定。理解 桶排序是計數排序的變種,把計數排序中相鄰的m個 小桶 放到乙個 大桶 中,在分完桶後,對每個桶進行排序 一般用快排 然後合併成最後的結果。桶排序是穩定演算法。基本思想 桶排序的思想近乎徹底的分治思想。效...
資料結構與演算法 桶排序
與基數排序法一樣,桶排序也是一種排序的思想。待排資料的值必須在乙個範圍內,然後把這個值域空間劃分為若干區塊,每乙個對應乙個桶,把待排陣列放入到合適的桶中,再對桶內的資料採用任意一種方式排序。整個時間複雜度分為兩部分,第一部分是入桶,為on,第二部分則是所有桶內排序的時間。演算法導論 中證明了這個整體...
資料結構與演算法 桶排序
桶排序可以看成是計數排序的公升級版,它將要排的資料分到多個有序的桶裡,每個桶裡的資料再單獨排序,再把每個桶的資料依次取出,即可完成排序。我們拿一組計數排序啃不掉的資料 500,6123,1700,10,9999 來舉例。第一步,我們建立 10 個桶,分別來裝 0 1000 1000 2000 200...