Java常用演算法原理剖析
用Java實現的所有演算法(用於教育)
這些只是為了演示的目的。在Java標準庫中有許多不同型別的實現,由於效能原因這些要好得多。
排序演算法
氣泡
從維基百科氣泡排序,叫做下沉排序,是一種簡單的排序演算法,反覆遍歷要排序的列表,比較每一對相鄰的專案,並在排序錯誤的情況下交換。遍歷列表將被重複,直到不需要交換,這表明列表已被排序。
特性
- 最差情況下的效能O(n^2)
- 最佳案例表現O(N)
- 平均病例效能O(n^2)
檢視演算法行動
插入
從維基百科插入排序是一種簡單的排序演算法,每次構建最終排序陣列(或列表)。在大型列表中,效率要比更高階的演算法(如快速排序、堆排序或合併排序)低得多。
特性
- 最差情況下的效能O(n^2)
- 最佳案例表現O(N)
- 平均病例效能O(n^2)
檢視演算法行動
合併
合併排序(通常也是拼寫合併)是一種高效的、通用的、基於比較排序演算法。大多數實現都會產生穩定的排序,實現在排序的輸出中保留相同元素的輸入順序。Mergesort是由JohnvonNeumann於1945年發明的分而治之的演算法。
特性
- 最壞的情況效能O(N Log N)(典型)
- 最佳情況效能O(N Log N)
- 平均情況效能O(N Log N)
檢視演算法行動
速戰速決
從維基百科快速排序(有時稱為分割槽-交換排序)是一種有效的排序演算法,是一種系統的方法,用於排列陣列的元素。
特性
- 最差情況下的效能O(n^2)
- 最佳情況下O(N Log N)或O(N)具有三向分割槽
- 平均病例效能O(n^2)
檢視演算法行動
選擇
將輸入列表分為兩個部分:已經排序項的子列表(在列表的前面(左)從左到右建立)和佔據列表其餘部分的待排序項的子列表。最開始排序子列表是空的,未排序子列表是整個輸入列表。該演算法通過查詢未排序子列表中最小的(或最大的,取決於排序順序)元素,將其與最左邊的未排序元素交換(按排序順序排列),並將子列表邊界向右移動。
特性
- 最差情況下的效能O(n^2)
- 最佳案例效能O(n^2)
- 平均病例效能O(n^2)
檢視演算法行動
殼
ShellSort是插入排序的一種推廣,允許交換相距很遠的項。思路是安排元素列表,以便從任何地方開始,考慮到每個第n個元素都會給出一個排序列表。這樣的列表叫做h排序。等效地,可以被認為是h交錯列表,每個元素都是單獨排序的。
特性
- 最壞的效能O(Nlog 2 2n)
- 最佳情況效能O(N Log N)
- 平均病例效能取決於間隙序列
檢視演算法行動
時間緊圖
比較排序演算法(氣泡排序、插入排序、選擇排序)的複雜性
複雜性圖
搜尋演算法
線性
線性搜尋或順序搜尋是在列表中查詢目標值的一種方法。會依次檢查列表中的每個元素的目標值,直到找到匹配或搜尋所有元素為止。線性搜尋在最壞的線性時間執行,最多進行n個比較,其中n是列表的長度。
特性
- 最壞的效能O(N)
- 最佳案例表現O(1)
- 平均個案表現O(N)
- 最壞情況下空間複雜度O(1)迭代
二進位制
此演算法也叫半間隔搜尋或對數搜尋演算法,查詢目標值在排序陣列中的位置。將目標值與陣列的中間元素進行比較;如果不相等,則消除目標陣列的一半,並在其餘的一半上繼續搜尋,直到成功為止。
特性
- 最壞的效能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
-
矩陣
相關文章
- [java]HashMap原理剖析JavaHashMap
- Java引用型別原理剖析Java型別
- Java原子類操作原理剖析Java
- Java併發之AQS原理剖析JavaAQS
- Java執行緒池核心原理剖析Java執行緒
- Java物件複製原理剖析及最佳實踐Java物件
- AbstractQueuedSynchronizer原理剖析
- JVM原理剖析JVM
- Memcached 原理剖析
- KVC原理剖析
- Eureka原理剖析
- Java 常用加密解密演算法Java加密解密演算法
- Java執行緒池ThreadPoolExecutor實現原理剖析 #28Java執行緒thread
- Java集合 HashSet的原理及常用方法Java
- ReactDom render原理剖析React
- Module Federation原理剖析
- redux applyMiddleware 原理剖析ReduxAPP
- JAVA常用資料結構及原理分析Java資料結構
- vue-router原理剖析Vue
- Javascript 技術原理剖析JavaScript
- RunTime實現原理剖析
- 剖析 Elasticsearch 的索引原理Elasticsearch索引
- Atomic原子操作原理剖析
- Kafka事務原理剖析Kafka
- HashMap原理底層剖析HashMap
- Docker 原理剖析(三)rootfsDocker
- jQuery原始碼剖析(五) - 事件繫結原理剖析jQuery原始碼事件
- 【演算法】Java實現七種常用排序演算法演算法Java排序
- Java引用型別原理深度剖析,看完文章,90%的人都收藏了Java型別
- ThreadLocal及InheritableThreadLocal的原理剖析thread
- Servlet系列:(一)servlet原理剖析Servlet
- 矩陣鍵盤原理剖析矩陣
- Kafka原理剖析之「Topic建立」Kafka
- redisson分散式鎖原理剖析Redis分散式
- 剖析Flutter的常用庫get_itFlutter
- 《java學習三》併發程式設計 -------執行緒池原理剖析Java程式設計執行緒
- Java阻塞佇列中的異類,SynchronousQueue底層實現原理剖析Java佇列
- Java實現常用加密演算法-SM4Java加密演算法