箱排序的變種。爲了區別於上述的箱排序,姑且稱它爲桶排序(實際上箱排序和桶排序是同義詞)。
算法
桶排序的思想是把[0,1)劃分爲n個大小相同的子區間,每一子區間是一個桶。而後將n個記錄分配到各個桶中。由於關鍵字序列是均勻分佈在[0,1)上的,因此通常不會有不少個記錄落入同一個桶中。因爲同一桶中的記錄其關鍵字不盡相同,因此必須採用關鍵字比較的排序方法(一般用插入排序)對各個桶進行排序,而後依次將各非空桶中的記錄鏈接(收集)起來便可。spa
注意:指針
這種排序思想基於如下假設:假設輸入的n個關鍵字序列是隨機分佈在區間[0,1)之上。若關鍵字序列的取值範圍不是該區間,只要其取值均非負,咱們總能將全部關鍵字除以某一合適的數,將關鍵字映射到該區間上。但要保證映射後的關鍵字是均勻分佈在[0,1)上的。code
僞代碼算法爲:排序
void BucketSon(R)
{ //對R[0..n-1]作桶排序,其中0≤R[i].key<1(0≤i<n)
for(i=0,i<n;i++) //分配過程.
將R[i]插入到桶B[「n(R[i].key)」]中; //可插入表頭上
for(i=0;i<n;i++) //排序過程
當B[i]非空時用插人排序將B[i]中的記錄排序;
for(i=0,i<n;i++) //收集過程
若B[i]非空,則將B[i]中的記錄依次輸出到R中;
}
注意:
class
實現時需設置一個指針向量B[0..n-1]來表示n個桶。但由於任一記錄R[i]的關鍵字知足:0≤R[i].key<1(0≤i≤n-1),因此必須將R[i].key映射到B的下標區間[0,n-1)上才能使R[i]裝入某個桶中,這可經過└n*(R[i].key)┘來實現。方法
桶排序的平均時間複雜度是線性的,即O(n)。但最壞狀況仍有多是O(n2)。時間
箱排序只適用於關鍵字取值範圍較小的狀況,不然所需箱子的數目m太多致使浪費存儲空間和計算時間。co
【例】n=10,被排序的記錄關鍵字ki取值範圍是0到99之間的整數(36,5,16,98,95,47, 32,36,48)時,要用100個箱子來作一趟箱排序。(即若m=n2時,箱排序的時間O(m+n)=O(n2))。void