Java常用算法

一、排序算法

排序算法是计算机科学中最基础的算法之一,用于将一组数据按照特定顺序排列。

1.1 冒泡排序(Bubble Sort)
  • 通过重复遍历列表,比较相邻元素并交换位置,直到列表有序。
  • 时间复杂度:O(n²)。
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(n²)。
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(n²)。
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(n²)。
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.mzph.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…