Java常用演算法原理剖析

java架構發表於2018-05-17

用Java實現的所有演算法(用於教育)

這些只是為了演示的目的。在Java標準庫中有許多不同型別的實現,由於效能原因這些要好得多。

排序演算法

氣泡

Java常用演算法原理剖析

從維基百科氣泡排序,叫做下沉排序,是一種簡單的排序演算法,反覆遍歷要排序的列表,比較每一對相鄰的專案,並在排序錯誤的情況下交換。遍歷列表將被重複,直到不需要交換,這表明列表已被排序。

特性

  • 最差情況下的效能O(n^2)
  • 最佳案例表現O(N)
  • 平均病例效能O(n^2)

檢視演算法行動

插入

Java常用演算法原理剖析

從維基百科插入排序是一種簡單的排序演算法,每次構建最終排序陣列(或列表)。在大型列表中,效率要比更高階的演算法(如快速排序、堆排序或合併排序)低得多。

特性

  • 最差情況下的效能O(n^2)
  • 最佳案例表現O(N)
  • 平均病例效能O(n^2)

檢視演算法行動

合併

Java常用演算法原理剖析

合併排序(通常也是拼寫合併)是一種高效的、通用的、基於比較排序演算法。大多數實現都會產生穩定的排序,實現在排序的輸出中保留相同元素的輸入順序。Mergesort是由JohnvonNeumann於1945年發明的分而治之的演算法。

特性

  • 最壞的情況效能O(N Log N)(典型)
  • 最佳情況效能O(N Log N)
  • 平均情況效能O(N Log N)

檢視演算法行動

速戰速決

Java常用演算法原理剖析

從維基百科快速排序(有時稱為分割槽-交換排序)是一種有效的排序演算法,是一種系統的方法,用於排列陣列的元素。

特性

  • 最差情況下的效能O(n^2)
  • 最佳情況下O(N Log N)或O(N)具有三向分割槽
  • 平均病例效能O(n^2)

檢視演算法行動

選擇

Java常用演算法原理剖析

將輸入列表分為兩個部分:已經排序項的子列表(在列表的前面(左)從左到右建立)和佔據列表其餘部分的待排序項的子列表。最開始排序子列表是空的,未排序子列表是整個輸入列表。該演算法通過查詢未排序子列表中最小的(或最大的,取決於排序順序)元素,將其與最左邊的未排序元素交換(按排序順序排列),並將子列表邊界向右移動。

特性

  • 最差情況下的效能O(n^2)
  • 最佳案例效能O(n^2)
  • 平均病例效能O(n^2)

檢視演算法行動

Java常用演算法原理剖析

ShellSort是插入排序的一種推廣,允許交換相距很遠的項。思路是安排元素列表,以便從任何地方開始,考慮到每個第n個元素都會給出一個排序列表。這樣的列表叫做h排序。等效地,可以被認為是h交錯列表,每個元素都是單獨排序的。

特性

  • 最壞的效能O(Nlog 2 2n)
  • 最佳情況效能O(N Log N)
  • 平均病例效能取決於間隙序列

檢視演算法行動

時間緊圖

比較排序演算法(氣泡排序、插入排序、選擇排序)的複雜性

複雜性圖


搜尋演算法

線性

Java常用演算法原理剖析

線性搜尋或順序搜尋是在列表中查詢目標值的一種方法。會依次檢查列表中的每個元素的目標值,直到找到匹配或搜尋所有元素為止。線性搜尋在最壞的線性時間執行,最多進行n個比較,其中n是列表的長度。

特性

  • 最壞的效能O(N)
  • 最佳案例表現O(1)
  • 平均個案表現O(N)
  • 最壞情況下空間複雜度O(1)迭代

二進位制

Java常用演算法原理剖析

此演算法也叫半間隔搜尋或對數搜尋演算法,查詢目標值在排序陣列中的位置。將目標值與陣列的中間元素進行比較;如果不相等,則消除目標陣列的一半,並在其餘的一半上繼續搜尋,直到成功為止。

特性

  • 最壞的效能O(Log N)
  • 最佳案例表現O(1)
  • 平均案例效能O(Log N)
  • 最壞情況空間複雜度O(1)

ShellSort是插入排序的一種推廣,允許交換相距很遠的項。思路是安排元素列表,便於任何地方開始,考慮到每個第n個元素都會給出一個排序列表。這樣的列表叫做h排序。等效地,可以被認為是h交錯列表,每個元素都是單獨排序的。

特性

  • 最壞的效能O(Nlog 2 2n)
  • 最佳情況效能O(N Log N)
  • 平均病例效能取決於間隙序列

檢視演算法行動


與其他演算法的連結

轉換 動態規劃 密碼 雜類
任何基地到任何基地 硬幣兌換 凱撒沙拉 堆排序
任何基到十進位制 蛋滴 柱狀轉位密碼 迴文素校驗器
二進位制到十進位制 斐波納契 RSA 很快.。
二進位制到十六進位制 Kadane演算法 更多的很快就會到來.。  
二進位制到八進位制 揹包    
十進位制到任意基 最長公共子序列    
十進位制到二進位制 最長增長子序列    
十進位制到十六進位制 棒材切割    
還有更多.。 還有更多.。    

資料結構

列表 排隊
BFS 空堆異常 圓連結串列 通用陣列列表佇列
外勤部 雙連結串列 排隊
堆元素 單連結串列  
Kruskals演算法 最大堆    
矩陣圖 民堆    
PrimMST      
堆疊
節點堆疊 AVL樹
連結串列堆疊 二叉樹
堆疊 還有更多.。
  • 緩衝器

  • HashMap

  • 矩陣


相關文章