任何基於比較的排序算法,其時間複雜度都不可能低於O(nLogn),基數排序可以打破這個瓶頸,對於範圍在1到k的元素序列,其複雜度爲O(n+k)。
但是當元素的範圍爲1到n^2的時候,就不該用計數排序了,因爲這種情況下需要O(n^2)的輔助空間,這比基於比較的排序算法要壞得多。
那麼對於範圍爲1到n^2的序列,有沒有複雜度爲線性的算法呢?有,那就是本章要討論的基數排序算法(Radix Sort)。基數排序的基本思想是對輸入序列的各元素,從它們的低位向高位進行逐位的比較排序。
基數排序算法的主要過程爲:
(1)分配,即從個位數開始,根據當前位的大小,把所有元素放到不同的桶中,桶編號從0到9。例如元素75,各個數爲5,所以被放到編號爲5的桶中,而元素802被放到編號爲2的桶中;
(2)收集,從編號爲0的桶開始,把各個桶中的元素按其先後順序重新收集起來;
(3)重複步驟1、2,直到比較到最高位爲止,然後從0號桶按序收集所有元素,就得到輸入數據的有序序列了。
以輸入序列170, 45, 75, 90, 802, 24, 2, 66爲例,應用上述算法處理的過程如下
(1)按個位數排序,得到下面的序列(注意要保持元素在原始序列中的相對位置,如原序列中802在2的前面,所以在按位數排序的時候,802也必須在2的前面,45和75等也類似)
170, 90, 802, 2, 24, 45, 75, 66
(2)按十位數排序,得到下面的序列
802, 2, 24, 45, 66, 170, 75, 90
(3)按百位數排序,得到下面最終的有序列
2, 24, 45, 66, 75, 90, 170, 802
C++實現
#include<iostream>
using namespace std;
// A utility function to get maximum value in arr[]