常見的排序算法,像歸併排序,堆排序時間複雜度爲O(nlgn);像冒泡排序,插入排序則爲O(n^2)。對於排序算法而言,只要你是通過比較,O(nlgn)是一條難以逾越的界限。爲了追求更快的速度,智慧的人類發明了一種新的方法——計算排序(Counting sorts),在這種算法中沒有比較運算,下面簡單的介紹一下。
對於這個算法,有個比較重要的約束條件——排列的數據必須在特定的範圍,我們假設區間範圍爲[1, k]。
用到3個數組,A[ ]表示需整理的原數組,B[ ]表示輸出的數組結果,C[i ](1<= i <= k)表示在A中每個元素出現的頻率,比如C[1]=2表示數組中元素1出現2次。
僞代碼如下:
for i= 1 to k
do C[i] = 0; //將數組C 各個值初始化爲0
for j = 1 to n
do C[a[j]] = C[a[j]] + 1; // 計算每個元素出現的頻率
for i = 2 to k
do C[I] = C[I] + C[I-1]; // 此時的C[i] 表示元素小於等於i的頻率,前綴加法
for j = n to 1
do B[C[A[j]] = A[j]
C[A[j]] = C[A[j]] - 1; //最後爲分配,較難理解,結合實例自己畫畫有助於理解
該方法時間複雜度爲O(k+n),所以使用時結合k與n的大小,由於排序算法最優爲O(nlgn),So
if k <nlgn use Counting sorts
else use Merge sort,由此可見該方法一般處理數據規模較小的序列。
方法二 基數排序算法:可以處理大規模數據,以方法一爲基礎
主要思想爲由低位到高位,按位排序,比如數據{ 237,393, 456},經過
個位排序{ 393, 456, 237 } ——》十位排序{ 237, 456, 393 } ——》 百位排序{ 237, 393, 456}從而得到最終結果。