排序演算法 桶排序

2021-06-12 07:37:44 字數 1811 閱讀 9178

2009-12-02 12:01

2817人閱讀

桶排序 (bucket sort)或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序)。桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間(θ(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個數字是平均分布這個假設的。這個假設是很強的,實際應用中效果並沒有這麼好。如果所有的數字都落在同乙個桶中,那就退化成一般的排序了。

code:

#include 

#include 

#include 

extern

void

quick_sort(

inta, 

intp, 

intq);

/* not necessary */

struct

barrel ;   

void

bucket_sort(

intdata, 

intsize)   

else

if(data[i] < min)    

}   

num = (max - min + 1) / 10 + 1;   

pbarrel = (

struct

barrel*)malloc(

sizeof

(struct

barrel) * num);   

memset(pbarrel, 0, 

sizeof

(struct

barrel) * num);   

/* put data[i] into barrel which it belong to */

for(i = 0; i < size; i++)    

pos = 0;   

for(i = 0; i < num; i++)    

}   

free(pbarrel);   

}   

main()   

, i;   

intsize = 

sizeof

(data) / 

sizeof

(int

);   

bucket_sort(data, size);   

for(i = 0; i < size; i++)   

printf(

"%d "

, data[i]);   

}  

注意這裡的快速排序用的筆記中的版本。

排序演算法 桶排序

桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n 但桶排序並不...

排序演算法 桶排序

桶排序 bucket sort 或所謂的箱排序的原理是將陣列分到有限數量的桶子裡,然後對每個桶子再分別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 最後將各個桶中的資料有序的合併起來。排序過程 假設待排序的一組數統一的分布在乙個範圍中,並將這一範圍劃分成幾個子範圍,也就是桶 ...

排序演算法 桶排序

桶排序是乙個在時間複雜度和空間複雜度十分極端的演算法,它的時間複雜度可以達到o n o n o n 但是空間複雜度確是十分的高,這個高取決於陣列中最大的數。即最大的數是多少,就需要開闢多少的空間,當然這個說法只對於普通的桶排序來說的,對於有些使用鍊錶或者桶排序 插入排序的做法,就各有情況了。做法其實...