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

2021-06-17 18:03:27 字數 2315 閱讀 7192

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

比較排序有:插入排序法、合併排序法、堆排序法、氣泡排序法、選擇排序法、快速排序法等等、

非比較排序有:計數排序法、基數排序法、桶排序法。

下面以我的理解來分別說說它們各自的特點。不過在此之前,我先闡述兩個概念:原地排序 、穩定排序

原地排序:如果對陣列a進行排序,則這些資料是在a中進行重新排序的,在任何時候,至多只有其中的常數個數字是儲存在陣列之外的。

穩定排序:原陣列中相同元素的相對位置(即前後關係)在經過排序後仍然不變。例如a[5]=,經過穩定排序後為:a[5]=.

誰最實用?對於較短的陣列,比如說元素個數才十幾二十個,用氣泡排序法就可以了,因為我們大多數人對氣泡排序法可謂是信手拈來,可以不假思索就可以寫出,儘管其時間複雜度比較大。當然快速排序法是非常值得推薦的,他的適用範圍很廣,用的十分普遍。

插入排序:時間複雜度:o(n*n).是原定排序,穩定排序(在本文中所有說穩定排序的意思是可以是穩定排序,對於是否是穩定排序,還取決於具體的程式,看進行資料間比較時是否帶等號,但是快速排序肯定不是穩定排序)。其實我們玩鬥地主,摸牌的過程就是在進行插入排序!當原始陣列為正序排列時,所用時間最短;當原始陣列為逆序排序時,所用時間最長。所以插入排序適合於原陣列大多數元素已經排好的情況。(所謂正序、逆序只是相對的概念,如果要對陣列從小到大排序,則如果原陣列本身是從大到小排列的,則稱為逆序,否則稱為正序)。

合併排序:時間複雜度:o(nlogn).不是原地排序,可以是穩定排序。它和快速排序一樣是基於分而治之的思想的(稍有不同),但是它比快速排序要快一點。儘管如此,由於它不是原地排序,需要占用較多空間,所以運用沒有快速排序廣泛。它和插入排序相比,它的最壞運**況是o(nlogn),插入排序的最壞運**況為o(n*n),但插入排序中的常數因子使得在n比較小時,執行要更快一點。

氣泡排序

時間複雜度為:o(n*n),原地排序,穩定排序。由於平常遇到的排序都很簡單,並且大家可以對氣泡排序信手拈來,因此用的十分普遍。

選擇排序:時間複雜度為:o(n*n),原地排序,穩定排序。實際上,選擇排序和氣泡排序的思想上是一致的,只是在具體操作中使用了一點技巧,避免了資料的多次交換,因此執行時間比氣泡排序快一點。

堆排序:時間複雜度:o(nlogn).是原地排序。它是將插入排序和合併排序的優點集於一身。像插入排序一樣是原地排序,像合併排序一樣執行時間為o(nlogn).雖然堆排序是乙個漂亮的演算法,但是實際中,快速排序的乙個好的實現往往要優於堆排序。但是堆有個很常見的應用:作為高效的優先順序佇列。

快速排序:時間複雜度:o(nlogn),不穩定排序,原地排序。最壞的執行時間為o(n*n),它的執行時間與劃分的對稱性有關。加入隨機化後,在平均情況下,劃分就能比較均勻,從而就能獲得較好效能。

由定理可知,比較排序時間複雜度最好為o(nlogn),在上述的比較排序演算法中,時間複雜度為o(nlogn)較好的演算法有:合併排序、堆排序、快速排序。其中快速排序運用最廣泛,因為合併排序不是原地排序,需占用較多空間,堆排序的資料交換比較多。

計數排序

o(n),穩定排序、不是原地排序。其思想比較獨特,運用條件是陣列的元素的值域在某乙個範圍內,並且由於不是原地排序,需要占用額外的記憶體,所以運用不是很廣。

基數排序

o(n),穩定排序、不是原地排序。基數排序就是不斷地呼叫計數排序。其思想比較新穎,在進行比較兩個數的大小是反其道而行之,先從個位數開始比較。相比於從高位開始比較,它避免了記錄中間過程的值。

桶排序:o(n),穩定排序、不是原地排序。也是基於分而治之的思想,先將序列進行分類,然後分別處理,最後再合併。與合併演算法不同的是,合併的時候不需要進行比較。

上述的非比較排序中,其時間複雜度都是線性的,由於是非比較的排序,所以比較排序演算法的下界o(nlogn)就不適用了。他們都只有在一些特定的條件下使用,因此運用不是很廣泛,但是這些思想卻是值得我們學習的。!

比較排序:  插入排序

合併排序

堆排序氣泡排序

選擇排序

快速排序

非比較排序:

計數排序

基數排序

桶排序原文:

演算法導論 讀書筆記 排序演算法總結

排序演算法目錄 1.插入排序 2.歸併排序 3.堆排序 4.快速排序 5.計數排序 6.基數排序 7.桶排序 一.插入排序 1.第乙個元素認為已經排好序了 2.從第二個元素開始考慮,考慮第j個元素 3.從後往前比較,前面數大於第j個元素,則往後挪乙個位置 4.挪到數小於第j個元素,或者挪完,此時因為...

演算法導論排序演算法之最後總結(七)

經過兩天的時間自己又把比較常見的排序演算法學習了一遍,都是參考演算法導論裡面的偽 實現的.對過去的一些簡單的 溫習一下,做個總結。程式都很小,但是也有一些思想在裡面。如果這些都能熟練掌握對我們的程式設計還是有很大提高的。比如常見的二分的思想和遞迴的思想。但是有時候我們有了這些思想了為什麼還要繼續學習...

《演算法導論》 演算法導論2 2 1插入排序

2.1 插入排序。我們分析的第乙個演算法是插入排序演算法,輸入 n個數 a1,a2,a3,a4,a5,a6,a7 an 輸出 序列的乙個排列 即重新排序 a1 a2 a3 使a1 a2 a3 插入排序演算法的偽 是以乙個過程的形式給出的,稱為insertion sort,它的引數是乙個陣列。包括了n...