《演算法導論》總結(一) 線性時間排序演算法

2021-05-09 17:51:58 字數 1872 閱讀 2378

《演算法導論》第一部分,第8章。這章介紹了3個線性時間排序的演算法,也就是在o(n)的時間內排序的演算法,o(n)時間複雜度是排序演算法時間的極限,簡單想一下也能明白,再好的演算法也總得將所有資料全部讀一遍才能知道順序,所以複雜度至少也是n。雖然這幾個演算法排序的時間複雜度很低,但是這幾個演算法都有一定的應用限制,不適用於所以情形。不過,如果發現當前的應用環境符合這幾個演算法的限制,那用這幾個演算法能得到非常好的效果。

計數排序的限制條件是:所排物件的各個元素都是介於0--k的,並且這個k不是無限的,是在有限的記憶體裡能用陣列表示的。

計數排序的基本思想是,當讀到乙個數時,如果能確定出比這個元素小的數的個數,那這個數應該排的位置自然就知道了。為了實現這個目標,計數排序引入了2個輔助陣列,b和c。假設原陣列是a,長度為n,陣列b的長度也是n;假設每個元素的範圍是0--k,那陣列c的長度就是k。例如,已知我有一組數2 5 3 0 2 3 0 3,所有數的範圍都在0---5之間,那我們的陣列c宣告就應該是int c[6];

然後具體做法就是,遍歷一遍a,讀入乙個數,就在對應c的位置+1,例如,讀入乙個數2,就讓c[2]++,這樣,讀完一遍以後就知道各個數出現了多少次。然後對c進行整理,得出比這個數小的有多少個,整理辦法如下:

// assume c[0..k]

for i = 1 .. k do:

c[i] = c[i-1] + c[i]

最後得出了各個數都有多少個比它小的個數以後,就可以進行最後的排序了:

遍歷a,讀入乙個數x後就去c裡找他應該放的位置,即c[x]的值就是他應該放的位置,放入b陣列的該位置中,然後對應的c[x]-- (因為考慮到可能有重複的數)。

for i = 0 .. n do:

x = a[i]

index = c[x]

b[index] = x

c[x]--

基數排序演算法的基本思想是,在待排序列裡,分別從低位到高位依次排序,這樣最後整個序列就有序了。例如,序列329,57,657,839,436 排序過程是這樣的:

3 2 9

0 5 7

6 5 7

8 3 9

4 3 6 ^

=>

4 3 6

0 5 7

6 5 7

3 2 9

8 3 9 ^

=> 3 

2 9 4 

3 6 8 

3 9 0 

5 7 6 

5 7 ^

=>

0 5 7

3 2 9

4 3 6

6 5 7

8 3 9

這樣看似更麻煩了,本來只需要排一次的東西現在要排好幾次了,其實,這個主要是為了減輕上面1所講的技術排序的限制,例如,如果乙個序列裡的數的範圍很大,是2^32或者2^64,那麼這個序列就無法用技術排序了,但是,如果用基數排序,每一輪用一次計數排序,總得時間複雜度是m*o(n)=o(n)。我們還可以根據記憶體等條件的具體情況,可以每2位或者3位作為乙個單位進行排序。

這個演算法要注意的一點是:排序時必須從後往前排,並且各個數字必須對齊。

桶排序的演算法假設前提是:假設要排的序列都是均勻分布在 [0, 1) 區間上的實數。這樣就可以將 [0, 1) 區間平均分成m分,這樣所有數都是近似平均的分到各個小區間裡的,然後再對各個小區間進行排序,最後把整個桶連起來。再對小區間裡的數進行排序時可以選用一些常規的排序演算法(比如直接選擇排序),因為我們的假設裡有各個小區間裡的數應該不會太多。整個演算法的時間複雜度也是o(n),時間複雜度的具體推導過程書上寫得很清楚。

一道習題:

假設有一張高考學生成績表,表項是這樣的:姓名、身份證號、成績,一共有1000萬高考考生,他們的成績是0—900之間,可以有0.5,例如可能成績是650.5,但不可能是650.3 。應該如何排序?

計數排序(線性時間排序) 演算法導論

之前的排序都是通過比較得到的,即比較排序 在排序的最終結果中,各元素的次序依賴與它們之間的比較。而時間複雜度最好的也是o nlgn 接下來說乙個未經比較的排序,而複雜度則是線性的。計數排序 假設n個輸入元素的每乙個都是在0 k區間內的乙個整數,其中k為某個整數。當k o n 時,排序的執行時間為o ...

演算法導論 排序演算法總結

從六月初開始看演算法導論,陸陸續續看了有2個月了,但實際看的時間只有半個月左右。這期間都忙著找導師 期末考試,同時還回家修養了十來天。真正專心的看演算法是在離家返校後,由於沒有考試和作業的煩惱,天天都沉浸在演算法中,感覺效率較高。這段時間學到的東西較多,下面來總結一下 比較排序有 插入排序法 合併排...

演算法導論 第8章 線性時間排序

比較排序指在排序的最終結果各元素的次序依賴於它們之間的比較的排序演算法。在最壞情況下,任何比較排序演算法都需要做 nlgn 次比較。因此堆排序和歸併排序都是漸近最優的比較排序演算法。本章討論三種用運算而不是比較來確定排序順序的線性時間複雜度的排序演算法 計數排序假設n個輸入元素中的每乙個都是在0 k...