鴿巢排序, 也被稱作基數分類, 是一種
時間複雜度為(θ(n))且在不可避免遍歷每乙個元素並且排序的情況下效率最好的一種
排序演算法. 但它只有在差值(或者可被對映在差值)很小的範圍內的數值排序的情況下實用.
當涉及到多個不相等的元素, 且將這些元素放在同乙個"鴿巢"的時候, 演算法的效率會有所降低.為了簡便和保持鴿巢排序在適應不同的情況, 比如兩個在同乙個儲存桶中結束的元素必然相等
我們一般很少使用鴿巢排序, 因為它很少可以在靈活性, 簡便性, 尤是速度上超過其他
排序演算法. 事實上,
桶排序較鴿巢排序更加的實用.
鴿巢排序的乙個比較有名的變形是tally sort, 它僅僅適用非常有限的題目, 這個演算法因在programming pearls一書中作為解決乙個非常規有限集問題方法的例子而著名.
顯然, 快速排序可以當作只有兩個(有些情況下是三個)"鴿巢"的鴿巢排序
最壞 時間複雜度: o(n+n)
最好 時間複雜度:o(n+n)
平均 時間複雜度: o(n+n)
最壞 空間複雜度:o(n*n)
1. 給定乙個待排序
陣列,建立乙個備用陣列(鴿巢),並初始化元素為0,備用陣列的索引即是待排序陣列的值。
2.把待排序
陣列的值,放到「鴿巢」裡(即用作備用陣列的索引)。
3.把鴿巢裡的值再依次送回待排序
陣列。def pigeonhole_sort ( array a[n] ) :
array auxiliary[n] =
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
函式功能:實現鴿巢排序
引數: *array 為需要排序的陣列,length為陣列長度
num 可以為全域性變數 為待排序陣列中最大的元素值
void pigeonhole_sort(int* array, int length) ;
int i, k,j = 0;
for(i = 0; i < length; ++i)
auxiliary[array[i]]++;
for(i = 0; i < num; ++i)
for(k = 0; k < auxiliary[i]; ++k)
array[j++] = i;
}
鴿巢排序Pigeonhole sort
原理類似桶排序,同樣需要乙個很大的鴿巢 桶排序裡管這個叫桶,名字無所謂了 鴿巢其實就是陣列啦,陣列的索引位置就表示值,該索引位置的值表示出現次數,如果全部為1次或0次那就是桶排序 例如var pigeonhole new int 100 pigeonhole 0 的值表示0的出現次數.pigeonh...
演算法 鴿巢排序
鴿巢排序,名字很生動形象,其實就是把待排序的陣列中相同的元素扔到同乙個鴿巢。洛谷1177 排序 題目描述 將讀入的 n 個數從小到大排序後輸出。輸入格式 第 1 行為乙個正整數 n。第 2 行包含 n 個空格隔開的正整數 a i 為你需要進行排序的數,資料保證了a i 不超過10 9。輸出格式 將給...
鴿巢原理小結
最基礎的原理便是n 1的物體放到n個盒子裡,至少有乙個盒子放了兩個物體。poj 2356 有n個數,從中選出幾個數的和是n的倍數。不得不說數學是個神奇的東西,結論是任意的n個數,必然能找到連續的m個數之和是n的倍數。接下來簡單證明一下,組合數學書中,黑書都有介紹。sk表示a1 a2 ak,如果sk是...