排序演算法 5 線性時間排序

2022-09-02 15:18:15 字數 795 閱讀 2623

演算法導論有證明,基於比較的排序(插入,選擇,歸併,快速,堆排序)的漸進時間複雜度下限為o(lg(n))。因此,這裡提到的線性時間排序,必然不是基於比較的排序。本質上講,個人認為這些線性時間排序就是用空間換取時間。

計數排序,a,b均為長度為n的陣列,a為輸入,b為排序好的陣列,要求是a的元素必須都為小於k的非負數,計數排序直接將值作為c陣列的定址

1

void counting_sort(int a, int b, int n, intk)2

1617

delete c;

18 }

基排序,最直觀的理解是,當所有數的位數都小於d時,我們可以從最低位開始排序,直到最高位,類似於n個百位數,我們先比較個位,再比較十位,再比較百位,就可以完成排序了

void radix_sort(int a, int n, int

d)

對於某個位的數字來說,必然小於k(十進位制下,小於9),那麼我們就可以用計數排序在o(n+k)內完成排序,整個排序在o(d(n+k))內完成。

很顯然,計數排序,基排序都只能對非負整數進行排序,對浮點數則無效。桶排序則沒有這個限制。桶排序假定數字都在[0,1)區間內,且陣列a分布均勻,那麼我們可以設定n個小桶將[0,1)區間劃分,n*a[i]的整數值就可以得到a[i]所屬於的桶,然後對每個桶裡面的少量元素排序,最後將所有桶區間的結果按照順序合併起來,就可以得到排序結果。這裡就不放置**了,放置乙個原理圖可能更能說明問題:

線性時間排序演算法

基於比較的演算法的時間下限為nlogn,而計數排序 桶排序和基數排序這幾種非比較演算法卻可以突破這個下限,僅管它們對輸入都有一定限制條件,即輸入資料必須在某個範圍內。但是,這些演算法還是非常實用的。閒著沒事,寫了一下 詳細見 演算法導論 define no cmp sort ifdef no cmp...

線性時間排序演算法

基於比較的演算法的時間下限為nlogn,而計數排序 桶排序和基數排序這幾種非比較演算法卻可以突破這個下限,僅管它們對輸入都有一定限制條件,即輸入資料必須在某個範圍內。但是,這些演算法還是非常實用的。閒著沒事,寫了一下 詳細見 演算法導論 define no cmp sort ifdef no cmp...

線性時間排序演算法

繼續上一次的排序演算法的總結,今天帶來的是線性時間排序演算法 可以看到,我們之前的交換演算法時間複雜度最少也只是o nlogn 那麼有沒有o n 的時間複雜度的演算法呢,也是有的,就是線性時間排序演算法。常見的線性時間演算法有 計數排序,基數排序和桶排序,而基數排序和桶排序十分類似,這裡只介紹更為普...