鴿巢排序(Pigeonhole sort)
, 也被稱作基數分類
, 是一種時間複雜度
為O
(N+n
)且在不可避免遍曆每一個元素並且排序的情況下效率最好的一種排序演算法. 但它只有在差值(或者可被映射在差值)很小的範圍內的數值排序的情況下實用,同時也要求元素個數(n)和成為索引的值(N)大小相當。
作用在數組上,索引時間為常量值O(1),則有
最壞時間複雜度: O(N+n)
最好時間複雜度:O(N+n)
平均時間複雜度: O(N+n)
最壞空間複雜度:O(N*n)
演算法:
1. 給定一個待排序數組,建立一個備用數組(鴿巢),並初始化元素為0,備用數組的索引即是待排序數組的值。
2.把待排序數組的值,放到“鴿巢”裡(即用作備用數組的索引)。
3.把鴿巢裡的值再依次送回待排序數組。
演算法虛擬碼(類似Python代碼格式):
def pigeonhole_sort ( array a[n] ) :
array auxiliary[N] = {0}
var i ,k
var j = 0
for i = 0 -> n
auxiliary[ a[i] ] ++
for i = 0 -> N
for k = 0 ->auxiliary[i]
a[j++] = i
c源碼:
void pigeonhole_sort(int* array, int length)<br />{<br />int auxiliary[NUM] = {0};<br />int i, k,j = 0;<br />for(i = 0; i < length; ++i)<br />auxiliary[array[i]]++;<br />for(i = 0; i < NUM; ++i)<br />for(k = 0; k < auxiliary[i]; ++k)<br />array[j++] = i;<br />}<br />
更正:
1.(Dec ,6 ,2010) 最壞空間複雜度應該是O(N+n)
. wikipedia.org的是錯誤的。
參考:
維基百科
wikipedia's pigeonhole_sort