MIT算法導論5——線性時間排序

        常見的排序算法,像歸併排序,堆排序時間複雜度爲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}從而得到最終結果。

發佈了43 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章