鴿巢排序 Pigeonhole sort

2021-06-22 17:35:20 字數 1254 閱讀 1107

鴿巢排序, 也被稱作基數分類, 是一種

時間複雜度為(θ(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是...