資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

用Python實現的所有算法

排序算法

冒泡排序

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

冒泡排序,稱為下沉排序,是一種簡單的排序算法,它反覆遍歷要排序的列表,比較每對相鄰的項目,如果它們的順序錯誤則交換它們。重複傳遞列表,直到不需要交換,這表明列表已排序。

屬性

  • 最差情況表現O(n 2)
  • 最佳案例表現O(n)
  • 平均案例表現O(n 2)

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

桶排序是一種排序算法,它通過將數組元素分配到多個存儲區來工作。然後,使用不同的排序算法,或者通過遞歸地應用桶排序算法,對每個桶進行單獨排序。

屬性

  • 最差情況表現O(n 2)
  • 最佳案例表現O(n + k)
  • 平均案例績效O(n + k)

雞尾酒調酒器

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

雞尾酒調酒器排序,也稱為雙向泡泡排序,雞尾酒排序,搖床排序(也可以指選擇排序的變體),波紋排序,隨機排序或穿梭排序,是泡沫排序的變體,既穩定排序算法和比較排序。該算法與冒泡排序的不同之處在於,它在每次通過列表時都在兩個方向上排序。

屬性

  • 最差情況表現O(n 2)
  • 最佳案例表現O(n)
  • 平均案例表現O(n 2)

插入排序

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

插入排序是一種簡單的排序算法,可以一次構建一個項目的最終排序數組(或列表)。與大多數高級算法(如快速排序,堆棧或合併排序)相比,它在

大型列表上的效率要低得多。

屬性

  • 最差情況表現O(n 2)
  • 最佳案例表現O(n)
  • 平均案例表現O(n 2)

合併排序

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

合併排序(通常拼寫為mergesort)是一種有效的,通用的,基於比較的排序算法。大多數實現產生穩定的排序,這意味著實現保留排序輸出中相等元素的輸入順序。Mergesort是一種分而治之的算法,由John von Neumann於1945年發明。

屬性

  • 最差情況表現O(n log n)
  • 最佳案例績效O(n log n)
  • 平均案例績效O(n log n)

快速排序

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

快速排序(有時稱為分區交換排序)是一種有效的排序算法,用作按順序放置數組元素的系統方法。

屬性

  • 最差情況表現O(n 2)
  • 具有三向分區的最佳情況性能O(n log n)或O(n)
  • 平均案例績效O(n log n

堆是一種基於比較的排序算法。它可以被認為是一種改進的選擇排序。它將其輸入劃分為已排序和未排序的區域,並通過提取最大元素並將其移動到已排序區域來迭代縮小未排序區域。

屬性

  • 最差情況表現O(n
    log n
  • 最佳案例績效O(n log n
  • 平均案例績效O(n log n

選擇排序

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

選擇排序是一種算法,它將輸入列表分為兩部分:已排序的項目子列表,在列表的前面(左側)從左到右構建,以及剩餘要排序的項目的子列表列表的其餘部分。最初,排序的子列表為空,未排序的子列表是整個輸入列表。該算法通過查找未排序子列表中的最小(或最大,取決於排序順序)元素,與最左邊的未排序元素(將其按排序順序)交換(交換),並將子列表邊界向右移動一個元素來繼續。

屬性

  • 最差情況表現O(n 2)
  • 最佳案例表現O(n 2)
  • 平均案例表現O(n 2)

希爾排序

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

希爾排序是插入排序的概括,允許交換相距很遠的項目。我們的想法是安排元素列表,以便從任何地方開始,考慮每個第n個元素給出一個排序列表。據說這樣的列表是h分類的。等價地,它可以被認為是h交錯列表,每個列表單獨排序。

屬性

  • 最差情況表現O(n log 2 n
  • 最佳案例績效O(n log n
  • 平均案例表現取決於差距序列

拓撲

拓撲排序,有向圖的拓撲排序是其頂點的線性排序,使得對於從頂點u到頂點v的每個有向邊uvu在排序中位於

v之前。例如,圖的頂點可以表示要執行的任務,並且邊可以表示一個任務必須在另一個之前執行的約束; 在這個應用程序中,拓撲排序只是任務的有效序列。當且僅當圖形沒有有向循環時,即,如果它是有向非循環圖,則拓撲排序是可能的(DAG)。任何DAG都具有至少一個拓撲排序,並且已知算法用於在線性時間內構建任何DAG的拓撲排序。

時間複雜度圖

比較排序算法的複雜性(冒泡排序插入排序選擇排序

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

比較排序算法:

快速排序是一種非常快速的算法,但實現起來相當棘手 。Bubble sort是一種慢速算法,但很容易實現。為了對小數據集進行排序,冒泡排序可能是一個更好的選擇,因為它可以快速實現,但對於較大的數據集,快速排序的加速可能值得實現算法的麻煩。

搜索算法

線性

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

線性搜索或順序搜索是用於在列表中查找目標值的方法。它按順序檢查列表中的每個元素的目標值,直到找到匹配或直到搜索完所有元素。線性搜索在最差的線性時間運行並且最多進行n次比較,其中n是列表的長度。

屬性

  • 最差情況表現O(n)
  • 最佳案例表現O(1)
  • 平均案例表現O(n)
  • 最壞的案例空間複雜度O(1)迭代

二進制

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

二進制搜索,也稱為半間隔搜索對數搜索,是一種搜索算法,用於查找已排序數組中目標值的位置。它將目標值與數組的中間元素進行比較; 如果它們不相等,則目標不能說謊的一半被消除,並且在剩下的一半上繼續搜索直到它成功。

屬性

  • 最差情況表現O(log n)
  • 最佳案例表現O(1)
  • 平均案例績效O(log n)
  • 最壞情況下的空間複雜度O(1)

插值

插值搜索是一種用於搜索已按照分配給鍵(鍵值)的數值排序的數組中的鍵的算法。它首先由WW Peterson在1957年描述。插值搜索類似於人們在電話目錄中搜索名稱的方法(用於訂購書籍條目的關鍵值):在每個步驟中,算法計算剩餘搜索空間中的位置基於搜索空間邊界處的鍵值和所尋找的鍵的值,通常可以通過線性插值來尋找項目。然後將在該估計位置實際找到的鍵值與所尋找的鍵值進行比較。如果它不相等,則根據比較,剩餘的搜索空間被減少到估計位置之前或之後的部分。

相比之下,二進制搜索總是選擇剩餘搜索空間的中間,丟棄一半或另一半,這取決於在估計位置找到的密鑰與所尋找的密鑰之間的比較 - 它不需要密鑰的數值,只是他們的總訂單。剩餘的搜索空間縮小到估計位置之前或之後的部分。線性搜索僅使用相等性,因為它從一開始就逐個比較元素,忽略任何排序。

平均插值搜索使得log(log(n))比較(如果元素均勻分佈),其中n是要搜索的元素的數量。在最壞的情況下(例如,鍵的數值以指數方式增加),它可以構成O(n)比較。

在插值順序搜索中,插值用於查找正在搜索的項目附近的項目,然後使用線性搜索來查找確切項目。

快速選擇

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

快速選擇是一種選擇算法,用於查找無序列表中的第k個最小元素。它與快速排序算法有關。像quicksort一樣,它是由Tony Hoare開發的,因此也被稱為Hoare的選擇算法。[1] 像quicksort一樣,它在實踐中很有效並且具有良好的平均情況性能,但是具有差的最壞情況性能。Quickselect及其變體是最常用於高效實際實現的選擇算法。

Quickselect使用與快速排序相同的整體方法,選擇一個元素作為數據透視表,並根據數據透視表將數據分成兩部分,因此小於或大於數據透視表。但是,不要像在快速排序中那樣遞歸到雙方,而是快速選擇僅向一側遞歸 - 與正在搜索的元素的一側。這將平均複雜度從O(n log n)降低到O(n),最壞情況是O(n 2)。

與quicksort一樣,quickselect通常作為就地算法實現,除了選擇第k個元素之外,它還對數據進行部分排序。有關與排序的連接的進一步討論,請參閱選擇算法。

ROT13

資源推薦!Python算法實現面試必考經典算法大全,附源代碼!

ROT13(“旋轉13個位置”,有時用連字符ROT-13)是一個簡單的字母替換密碼,用字母表後面的第13個字母替換一個字母。ROT13是古羅馬開發的Caesar密碼的特例。

因為基本拉丁字母中有26個字母(2×13),所以ROT13是它自己的反轉; 也就是說,要撤消ROT13,應用相同的算法,因此可以使用相同的動作進行編碼和解碼。該算法幾乎不提供加密安全性,並且經常被引用為弱加密的典型示例。

傳送門

https://github.com/TheAlgorithms/Python

這些算法有現成的算法,但是還是建議大家在學習的時候,能夠自己動手寫出這些代碼,這些都是經典的算法,學習中可以參考,自己一定得能夠自己實現!

好啦,覺得好的歡迎轉發,留言互相交流學習!


分享到:


相關文章: