桶排序 (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個數字是平均分布這個假設的。這個假設是很強的,實際應用中效果並沒有這麼好。如果所有的數字都落在同乙個桶中,那就退化成一般的排序了。
程式示例:這裡用的是快排。
#include #include #include extern void quick_sort(int a, int p, int q);/* not necessary */
struct barrel ;
void bucket_sort(int data, int size)
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;
int size = sizeof(data) / sizeof(int);
bucket_sort(data, size);
for (i = 0; i < size; i++)
printf("%d ", data[i]);
}
C語言 桶排序
c語言 桶排序 比如十分制的成績排名 首先需要對陣列進行初始化,全部賦為0 表示0到10分值暫時沒有出現過 然後用for迴圈來輸入值 分數 將輸入的分數的賦給陣列下標 那麼所對應的值加一 表示該分數出現一次 以五個數舉例 如3,5,5,8,2 輸入後 輸出 通過兩層迴圈輸出 第一層迴圈控制下標,第二...
c語言排序之桶排序
桶排序 bucket sort 或所謂的 箱排序,是乙個 排序演算法 工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的 排序演算法 或是以遞迴方式繼續使用桶排序進行排序 桶排序是 鴿巢排序 的一種歸納 結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n...
C語言之IP排序
看到乙個比較初級的問題,4個字段的ip,如何排序?分析 排序是按每個欄位的整數值進行,而整個ip位址是字串型,故需要逐個字段讀取。注意到每個欄位0 255,可以用乙個位元組表示,而要比較大小,故用unsigned char型。讀取後,最自然的想法是逐個字段比較,依次比較4個字段,這個可以分別對每個字...