排序算法——鴿巢排序 Pigeonhole sort

鴿巢排序(Pigeonhole sort),也被稱作基數分類,其時間複雜度爲O(n),它是在不可避免遍歷每一個元素並且排序的情況下效率最好的一種排序算法。但它只有在差值(或者可被映射在差值)很小的範圍內的數值排序的情況下實用,如果元素值的範圍遠遠大於元素個數,那麼其性能會比桶排序差很多。

當涉及到多個不相等的元素,且將這些元素放在同一個"鴿巢"的時候,算法的效率會有所降低。一般很少使用鴿巢排序,因爲它在靈活性、簡便性、尤是速度上都比不過其它排序算法。而且在大多數情況下,待排序序列的數據範圍會比數據個數大得多,從而不滿足鴿巢排序的適用條件。事實上,桶排序較鴿巢排序更加的實用。

鴿巢排序的一個比較有名的變形是tally sort,它僅僅適用非常有限的問題,這個算法因在Programming Pearls一書中作爲解決一個非常規有限集問題方法的例子而著名。快速排序可以當作只有兩個(某些情況下是三個)"鴿巢"的鴿巢排序。

 

鴿巢排序的排序過程

(1)找出數組中的最小元素min和最大元素max,設置元素範圍爲range=max-min+1;

(2)創建一個長度爲range的數組當作鴿巢;

(3)遍歷輸入數組,把各元素放到對應的鴿巢中,元素arr[i]放到鴿巢中的arr[i]-min位置上;

(4)遍歷鴿巢,把非空的鴿巢中的元素放回原數組中。

 

鴿巢排序和計數排序類似,但是不同的是鴿巢排序會“移動”每個元素兩次,第一次是移動到鴿巢中,第二次是移動到最終的有序序列中。

C++實現

 

#includ
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章