Java常用算法

一、排序算法

排序算法是計算機科學中最基礎的算法之一,用于將一組數據按照特定順序排列。

1.1 冒泡排序(Bubble Sort)
  • 通過重復遍歷列表,比較相鄰元素并交換位置,直到列表有序。
  • 時間復雜度:O(n2)。
public void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}
1.2 選擇排序(Selection Sort)
  • 每次從未排序部分選擇最小元素,放到已排序部分的末尾。
  • 時間復雜度:O(n2)。
public void selectionSort(int[] arr) {int n = arr.length;for (int i = 0; i < n-1; i++) {int minIndex = i;for (int j = i+1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}
}
1.3 插入排序(Insertion Sort)
  • 將未排序部分的元素逐個插入到已排序部分的適當位置。
  • 時間復雜度:O(n2)。
public void insertionSort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j+1] = arr[j];j = j - 1;}arr[j+1] = key;}
}
1.4 快速排序(Quick Sort)
  • 采用分治法,選擇一個基準元素,將數組分為兩部分,遞歸排序。
  • 時間復雜度:平均 O(n log n),最壞 O(n2)。
public void quickSort(int[] arr, int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi-1);quickSort(arr, pi+1, high);}
}private int partition(int[] arr, int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}int temp = arr[i+1];arr[i+1] = arr[high];arr[high] = temp;return i+1;
}
1.5 歸并排序(Merge Sort)
  • 采用分治法,將數組分為兩半,分別排序后合并。
  • 時間復雜度:O(n log n)。
public void mergeSort(int[] arr, int l, int r) {if (l < r) {int m = (l + r) / 2;mergeSort(arr, l, m);mergeSort(arr, m+1, r);merge(arr, l, m, r);}
}private void merge(int[] arr, int l, int m, int r) {int n1 = m - l + 1;int n2 = r - m;int[] L = new int[n1];int[] R = new int[n2];for (int i = 0; i < n1; i++) {L[i] = arr[l + i];}for (int j = 0; j < n2; j++) {R[j] = arr[m + 1 + j];}int i = 0, j = 0;int k = l;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}while (i < n1) {arr[k] = L[i];i++;k++;}while (j < n2) {arr[k] = R[j];j++;k++;}
}

二、查找算法

查找算法用于在數據結構中查找特定元素。常見的查找算法包括:

2.1 線性查找(Linear Search)
  • 逐個檢查每個元素,直到找到目標元素。
  • 時間復雜度:O(n)。
public int linearSearch(int[] arr, int target) {for (int i = 0; i < arr.length; i++) {if (arr[i] == target) {return i;}}return -1;
}
2.2 二分查找(Binary Search)
  • 適用于已排序的數組,通過重復將搜索范圍減半來查找目標元素。
  • 時間復雜度:O(log n)。
public int binarySearch(int[] arr, int target) {int left = 0, right = arr.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;
}

三、圖算法

圖算法用于處理圖結構數據。常見的圖算法包括:

3.1 深度優先搜索(DFS)
  • 從起始節點開始,沿著一條路徑盡可能深入,直到無法繼續為止,然后回溯。
public void dfs(int[][] graph, int start, boolean[] visited) {visited[start] = true;System.out.print(start + " ");for (int i = 0; i < graph[start].length; i++) {int next = graph[start][i];if (!visited[next]) {dfs(graph, next, visited);}}
}
3.2 廣度優先搜索(BFS)
  • 從起始節點開始,逐層遍歷所有相鄰節點。
public void bfs(int[][] graph, int start) {boolean[] visited = new boolean[graph.length];Queue<Integer> queue = new LinkedList<>();visited[start] = true;queue.add(start);while (!queue.isEmpty()) {int node = queue.poll();System.out.print(node + " ");for (int i = 0; i < graph[node].length; i++) {int next = graph[node][i];if (!visited[next]) {visited[next] = true;queue.add(next);}}}
}
3.3 Dijkstra 算法
  • 用于計算單源最短路徑,適用于加權圖。
public void dijkstra(int[][] graph, int start) {int n = graph.length;int[] dist = new int[n];boolean[] visited = new boolean[n];Arrays.fill(dist, Integer.MAX_VALUE);dist[start] = 0;for (int i = 0; i < n-1; i++) {int u = minDistance(dist, visited);visited[u] = true;for (int v = 0; v < n; v++) {if (!visited[v] && graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) {dist[v] = dist[u] + graph[u][v];}}}printSolution(dist);
}private int minDistance(int[] dist, boolean[] visited) {int min = Integer.MAX_VALUE, minIndex = -1;for (int i = 0; i < dist.length; i++) {if (!visited[i] && dist[i] <= min) {min = dist[i];minIndex = i;}}return minIndex;
}private void printSolution(int[] dist) {System.out.println("Vertex \t Distance from Source");for (int i = 0; i < dist.length; i++) {System.out.println(i + " \t\t " + dist[i]);}
}

四、動態規劃

動態規劃用于解決具有重疊子問題和最優子結構性質的問題。常見的動態規劃問題包括:

4.1 斐波那契數列
  • 使用動態規劃計算斐波那契數列的第 n 項。
public int fibonacci(int n) {if (n <= 1) {return n;}int[] dp = new int[n+1];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i-1] + dp[i-2];}return dp[n];
}
4.2 背包問題
  • 解決 0-1 背包問題,即在給定容量下選擇物品使總價值最大。
public int knapsack(int[] weights, int[] values, int capacity) {int n = weights.length;int[][] dp = new int[n+1][capacity+1];for (int i = 1; i <= n; i++) {for (int j = 0; j <= capacity; j++) {if (weights[i-1] <= j) {dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weights[i-1]] + values[i-1]);} else {dp[i][j] = dp[i-1][j];}}}return dp[n][capacity];
}

五、貪心算法

貪心算法在每一步選擇中都采取當前狀態下最優的選擇,希望導致全局最優解。常見的貪心算法問題包括:

5.1 活動選擇問題
  • 選擇最大數量的互不重疊的活動。
public int activitySelection(int[] start, int[] end) {Arrays.sort(end);int count = 1;int lastEnd = end[0];for (int i = 1; i < end.length; i++) {if (start[i] >= lastEnd) {count++;lastEnd = end[i];}}return count;
}

六、回溯算法

回溯算法通過嘗試所有可能的解來解決問題,通常用于組合、排列等問題。常見的回溯算法問題包括:

6.1 N 皇后問題
  • 在 N×N 棋盤上放置 N 個皇后,使其互不攻擊。
public void solveNQueens(int n) {int[] queens = new int[n];Arrays.fill(queens, -1);backtrack(queens, 0, n);
}private void backtrack(int[] queens, int row, int n) {if (row == n) {printQueens(queens);return;}for (int col = 0; col < n; col++) {if (isSafe(queens, row, col)) {queens[row] = col;backtrack(queens, row+1, n);queens[row] = -1;}}
}private boolean isSafe(int[] queens, int row, int col) {for (int i = 0; i < row; i++) {if (queens[i] == col || Math.abs(queens[i] - col) == Math.abs(i - row)) {return false;}}return true;
}private void printQueens(int[] queens) {for (int i = 0; i < queens.length; i++) {for (int j = 0; j < queens.length; j++) {if (queens[i] == j) {System.out.print("Q ");} else {System.out.print(". ");}}System.out.println();}System.out.println();
}

七、字符串匹配算法

字符串匹配算法用于在文本中查找特定模式的子串。常見的字符串匹配算法包括:

7.1 KMP 算法
  • 通過預處理模式串,避免不必要的比較。
public int kmpSearch(String text, String pattern) {int[] lps = computeLPSArray(pattern);int i = 0, j = 0;while (i < text.length()) {if (pattern.charAt(j) == text.charAt(i)) {i++;j++;}if (j == pattern.length()) {return i - j;} else if (i < text.length() && pattern.charAt(j) != text.charAt(i)) {if (j != 0) {j = lps[j-1];} else {i++;}}}return -1;
}private int[] computeLPSArray(String pattern) {int[] lps = new int[pattern.length()];int len = 0, i = 1;while (i < pattern.length()) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;lps[i] = len;i++;} else {if (len != 0) {len = lps[len-1];} else {lps[i] = len;i++;}}}return lps;
}

八、數論算法

數論算法用于解決與整數相關的數學問題。常見的數論算法包括:

8.1 歐幾里得算法
  • 用于計算兩個整數的最大公約數(GCD)。
public int gcd(int a, int b) {if (b == 0) {return a;}return gcd(b, a % b);
}
8.2 素數檢測
  • 判斷一個數是否為素數。
public boolean isPrime(int n) {if (n <= 1) {return false;}for (int i = 2; i * i <= n; i++) {if (n % i == 0) {return false;}}return true;
}

九、位運算算法

位運算算法利用位操作來高效解決問題。常見的位運算算法包括:

9.1 計算二進制中 1 的個數
  • 使用位運算計算一個整數的二進制表示中 1 的個數。
public int countSetBits(int n) {int count = 0;while (n > 0) {count += n & 1;n >>= 1;}return count;
}
9.2 判斷一個數是否是 2 的冪
  • 使用位運算判斷一個數是否是 2 的冪。
public boolean isPowerOfTwo(int n) {return n > 0 && (n & (n - 1)) == 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72202.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72202.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72202.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu 24 安裝 python3.x 教程

目錄 注意事項 一、安裝不同 Python 版本 1. 安裝依賴 2. 下載 Python 源碼 3. 解壓并編譯安裝 二、管理多個 Python 版本 1. 查看已安裝的 Python 版本 2. 配置環境變量 3. 使用 update-alternatives? 管理 Python 版本 三、使用虛擬環境為項目指定特定 Python 版本…

【后端】【django】Django 自帶的用戶系統與 RBAC 機制

Django 自帶的用戶系統與 RBAC 機制 Django 自帶的用戶系統&#xff08;django.contrib.auth&#xff09;提供了 身份驗證&#xff08;Authentication&#xff09; 和 權限管理&#xff08;Authorization&#xff09;&#xff0c;能夠快速實現 用戶管理、權限控制、管理員后臺…

怎樣使用Modbus轉Profinet網關連接USB轉485模擬從站配置案例

怎樣使用Modbus轉Profinet網關連接USB轉485模擬從站配置案例 Modbus轉profinet網關可以將Modbus協議轉化為profinet協議&#xff0c;以實現設備之間的數據交互。在實際使用過程中&#xff0c;我們需要使用Modbus協議進行設備通訊&#xff0c;而profinet協議則是用于工業自動化…

5.編譯鏈接和宏**

1. 宏&#xff08;考察很多&#xff09;-要求輕松實現宏&#xff0c;很容易出錯 #define 機制包括了一個規定&#xff0c;允許把參數替換到文本中&#xff0c;這種實現通常稱為宏或定義宏。 下面是宏的聲明方式&#xff1a; #define name(參數列表) 內容 參數列表的左括號必…

如何搭建一個適配微信小程序,h5,app的uni-app項目

在vscode搭建 uni-app 項目&#xff08;Vue 3 Vite Pinia uView Plus&#xff09; 一、環境準備 1. 安裝 Node.js 確保已安裝 Node.js&#xff08;需≥14版本&#xff09;&#xff0c;可通過以下命令檢查版本&#xff1a; node -v2. 安裝 VSCode 從 VSCode 官網 下載并…

Kotlin apply 方法的用法和使用場景

Kotlin apply 方法的用法和使用場景 1. 方法簡介 apply 是 Kotlin 標準庫中的一個擴展函數&#xff0c;用于對對象執行一系列操作&#xff0c;并返回該對象本身。它的語法如下&#xff1a; inline fun <T> T.apply(block: T.() -> Unit): T參數&#xff1a;block 是…

一文解讀python高階功能:匿名函數到魔法方法(__call__)

文章目錄 一、python中匿名方法的使用使用示例注意事項總結 二、匿名函數和魔法方法的結合示例&#xff1a;結合 lambda 和 __call__解釋更復雜的示例 總結 一、python中匿名方法的使用 在 Python 中&#xff0c;匿名方法是通過 lambda 關鍵字定義的&#xff0c;通常稱為 lamb…

云服務器新手配置內網穿透服務(frp)

首先你得有一個公網服務器&#xff0c;有了它你就可以借助它&#xff0c;將自己電腦進行配置內網穿透&#xff0c;讓自己內網電腦也可以異地輕松訪問。網上教程較多&#xff0c;特此記錄我自己的配置&#xff0c;避免迷路&#xff0c;我這里只記錄我自己云服務小白&#xff0c;…

基于STM32的火災報警設備(阿里云平臺)

目錄 前言&#xff1a; 一、項目介紹和演示視頻 二、硬件需求準備 三、硬件框圖 1. 原理圖 2. PCB 四、CubeMX配置 五、代碼框架 前言&#xff1a; 源代碼下載鏈接&#xff1a; https://download.csdn.net/download/m0_74712453/90474701 需要實物的可以私信博主或者…

學習筆記之車票搜索為什么用Redis而不是ES?

在文章正式開始前&#xff0c;大家打開 12306.cn 搜索一趟列車&#xff0c;根據搜索條件判斷&#xff0c;數據搜索技術使用 ElasticSearch 或者其它搜索技術是否合適&#xff1f; 這里我先把答案說下&#xff0c;12306 車票搜索用的是 Redis &#xff0c;而不是大家常用的 Ela…

揭秘AI:機器學習與深度學習的奧秘

文章目錄 機器學習與深度學習1. 什么是人工智能&#xff1f;2. 機器學習、深度學習和人工智能又是什么關系&#xff1f;3. 人工智能解決了什么問題&#xff1f;為什么需要人工智能&#xff1f;4. 機器學習、深度學習常用術語1&#xff09;模型2&#xff09;數據集3&#xff09;…

【具體場景實踐】使用存儲過程查數據全流程+自動調度

文章目錄 場景設計場景描述:公司員工管理系統需求1. 創建數據庫和表2. 插入測試數據3. 復雜存儲過程4. 調用存儲過程5. 結果示例6. 細節優化存儲過程總結7. 自動定期執行存儲過程7.1 啟用 MySQL 事件調度器7.2 創建定時任務(每天凌晨 2 點自動執行)7.3 查看和管理事件1?? …

【ubuntu】——wsl中使用windows中的adb

一、引言 在 Windows Subsystem for Linux&#xff08;WSL&#xff09;環境下工作時&#xff0c;有時需要使用 Android Debug Bridge&#xff08;ADB&#xff09;工具與 Android 設備進行交互。通過特定設置&#xff0c;能夠在 WSL 中便捷地調用 Windows 系統中已安裝的 ADB&a…

Centos離線安裝gcc

文章目錄 Centos離線安裝gcc1. gcc是什么&#xff1f;2. gcc下載地址3. gcc的安裝4. 安裝結果驗證 Centos離線安裝gcc 1. gcc是什么&#xff1f; GCC&#xff08;GNU Compiler Collection&#xff09;是 GNU 項目下的開源編譯器套件&#xff0c;主要用于將 C、C 等編程語言的源…

JAVA中的多態性以及它在實際編程中的作用

JAVA中的多態性以及它在實際編程中的作用&#xff1f; 在Java中&#xff0c;多態性是指一個對象可以具有多種形態。它主要體現在兩個方面&#xff1a;編譯時多態和運行時多態。 1.編譯時多態 編譯時多態通過方法重載&#xff08;Overloading&#xff09;來實現。方法重載是指…

NetLink內核套接字案例分析

一、基礎知識 Netlink 是 Linux 系統中一種內核與用戶空間通信的高效機制&#xff0c;而 Netlink 消息是這種通信的核心載體。它允許用戶態程序&#xff08;如網絡配置工具、監控工具&#xff09;與內核子系統&#xff08;如網絡協議棧、設備驅動&#xff09;交換數據&#xff…

批量壓縮與優化 Excel 文檔,減少 Excel 文檔大小

當我們在 Excel 文檔中插入圖片資源的時候&#xff0c;如果我們插入的是原圖&#xff0c;可能會導致 Excel 變得非常的大。這非常不利于我們傳輸或者共享。那么當我們的 Excel 文件非常大的時候&#xff0c;我們就需要對文檔做一些壓縮或者優化的處理。那有沒有什么方法可以實現…

基于深度學習的多模態人臉情緒識別研究與實現(視頻+圖像+語音)

這是一個結合圖像和音頻的情緒識別系統&#xff0c;從架構、數據準備、模型實現、訓練等。包括數據收集、預處理、模型訓練、融合方法、部署優化等全流程。確定完整系統的組成部分&#xff1a;數據收集與處理、模型設計與訓練、多模態融合、系統集成、部署優化、用戶界面等。詳…

保姆級離線TiDB V8+解釋

以前學習的時候還是3版本&#xff0c;如今已經是8版本了 https://cn.pingcap.com/product-community/?_gl1ujh2l9_gcl_auMTI3MTI3NTM3NC4xNzM5MjU3ODE2_gaMTYwNzE2NTI4OC4xNzMzOTA1MjUz_ga_3JVXJ41175MTc0MTk1NTc1OC4xMS4xLjE3NDE5NTU3NjIuNTYuMC41NDk4MTMxNTM._ga_CPG2VW1Y4…

spark實驗2

一.實驗題目 實驗所需要求&#xff1a; centos7虛擬機 pyspark spark python3 hadoop分布式 統計歷屆春晚的節目數目 統計各個類型節目的數量&#xff0c;顯示前10名 統計相聲類節目歷年的數目。 查詢每個演員在春晚上表演節目的數量。 統計每年各類節目的數量&#xff0…