排序算法——基數排序 Radix Sort

任何基於比較的排序算法,其時間複雜度都不可能低於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[]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章