几种常见的算法
一、冒泡排序法
冒泡排序法
原始数据:3 2 7 6 8
第1次循环:(最大的跑到最右边)
2 3 7 6 8(3和2比较,2<3 所以2和3交换位置)
2 3 7 6 8(3和7比较,3<7 所以不需要交换位置)
2 3 6 7 8(6和7比较,6<7 所以6和7交换位置)
2 3 6 7 8(7和8比较,7<8 所以不需要交换位置)
经过第1次循环,此时剩下参与比较的数据:2 3 6 7
第2次循环:
2 3 6 7(2和3比较,2<3,所以不需要交换位置)
2 3 6 7(3和6比较,3<6,所以不需要交换位置)
2 3 6 7 (6和7比较,6<7,所以不需要交换位置)
经过第2次循环,此时剩下参与比较的数据是:2 3 6
第3次循环:
2 3 6(2和3比较,2<3,所以不需要交换位置)
2 3 6(3和6比较,3<6,所以不需要交换位置)
经过第3次循环,此时剩下参与比较的数据是:2 3
第4次循环
2 3(2和3比较,2<3,所以不需要交换位置)
public class BubbleSort{
public static void main(String[] args){
//这是int类型的数组对象
int[] arr = {3,2,6,7,8};
//经过冒泡排序算法对以上数组中元素进行排序
//冒泡排序算法的核心是什么?
//7条数据,循环6次。以下的代码可以循环6次(冒泡排序法采用外层循环)
int count = 0;
for(int i=arr.length-1;i>0;i--){
//不管是否需要交换,总之是要比较一次的
count++;
//9 8 10 7 6 0 11
for(int j=0;j<i;j++){
if(arr[i]>arr[j+1]){
//交换位置
//arr[j]和arr[j+1]交换
int temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println("比较次数:”+count);
//输出结果
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
二、选择排序法
选择排序法比冒泡排序法的效率高
高在交换位置上
选择排序的交换位置是有意义的
每一次从这“堆”参与比较的数据当中“找出最小值”
拿这个最小值和“参与比较的这堆最前面的元素”交换位置
循环一次,然后找出参加比较的这堆数据中最小的。拿这个最小的值和
最前面的数据交换位置。
参与比较的数据:3 1 6 2 5
第1次循环之后的结果是: 1 3 6 2 5
下次参与比较的数据:3 6 2 5
第2次循环之后的结果是:2 6 3 5
下次参与比较的数据是:6 3 5
第3次循环之后的结果是:3 6 5
下次参与比较的数据是: 6 5
第4次循环之后的结果是: 5 6
注意:5条数据,循环4次
冒泡排序和选择排序实际上比较的次数没变
交换位置的次数减少了
3 2 6 1 5
假设:
第1个3是最小的
3和2比较,发现2更小,所以此时最小的是2
继续拿着2往下比对,2和6比较,2仍然是最小的
继续拿着2往下比对,2和1比对,发现1更小,所以此时最小的是1
继续拿着1往下比对,1和5比对,发现1还是小的,所以1就是最小的
拿着1和最左边的3交换位置
2 6 3 5
假设:
第1个2是最小的
……
6 3 5
假设6是最小的,6和3比对,发现3更小,所以此时最小的是3
……
public class SelectSort{
public static void main(String[] args){
int[] arr = {3,1,6,2,5};
int count = 0;
//选择排序
//5个数据循环4次(外层循环4次)
for(int i=0;i<arr.length-1;i++){
//i的值是0 1 2 3
//i正好是“参加比较的这堆数据中”最左边那个元素的下标
//i是一个参与比较的这堆数据中的起点下标
//假设起点i下标位置上的元素是最小的
int min = I;
for(int j=i+1;j<arr.length;j++){
count++;
if(arr[j]<arr[min]){
min = j; //最小值的元素下标是j
}
}
//当i和min相等时,表示最初猜测是对的
//当i和min不相等时,表示最初猜测是错的,有比这个元素更小的元素
//需要拿着这个更小的元素和最左边的元素交换位置
if(min!=i){
//表示存在更小的数据
//arr[min]最小的数据
//arr[i]最前面的数据
int temp;
temp = arr[min];
arr[min = arr[i];
arr[i] = temp;
}
}
System.out.println("比较次数"+count);
//排序之后遍历
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
三、二分法查找
数组的元素查找
数组元素查找两种方式:
第一种方式:一个一个挨着找,直到找到为止
第二种方式:二分法查找(算法),这个效率较高
public class ArraySearch{
public static void main(String[] args){
//这个例子演示第一种方式
int[] arr = {4,5,6,87,8};
//需求:找出87的下标。一个一个挨着找
for(int i=0;i<arr.length;i++){
if(arr[i]==87){
System.out.println("87元素的下标是:"+i);
return;
}
}
//程序执行到此处,表示没有87
System.out.println("87不存在该元素!");
//最好以上的程序封装到一个方法,思考:传什么参数?返回什么值?
//传什么:第一个参数是数组,第二个参数是被查找的元素
//返回值:返回被查找的这个元素的下标,如果找不到返回-1
int index = arraySearch(arr,87);
System.out.println(index == -1?"该元素不存在1":"该元素下标是:"+index):
}
//从数组中检索某个元素的下标(返回的是第一个元素的下标)
//arr 被检索的数组
//ele 被检索的元素
//大于等于0的数表示元素的下标,-1表示该元素不存在
public static void arraySearch(int[] arr,int ele){
for(int i=0;i<arr.length;i++){
if(ele == arr[i]){
return I;
}
}
return -1;
}
}
关于查找算法中的:二分法查找
10(下标0)11 12 13 14 15 16 17 18 19 20(下标10) arr数组
通过二分法查找,找出18这个元素的下标:
(0+10)/2-->中间元素的下标:5
拿着中间这个元素和目标要查找的元素进行对比:
中间元素是:arr[5]-->15
15<18(被查找的元素)
被查找的元素18在目前中间元素15的右边
再重新计算一个中间元素的下标:
开始下标是:5+1
结束下标是:10
(6+10)/2-->8
8下标对应的元素arr[8]是18
找到的中间元素正好和被查找的元素18相等,表示找到了:下标为8
二分法查找的终止条件:一直折半,直到中间的那个元素恰好是被查找的元素
二分法查找算法是基于排序的基础之上。(没有排序的数据是无法查找的)
publc class ArrayUtil{
public static void main(String[] args){
int[] arr = {100,200,230,235,600,1000,2000,9999);
//找出arr这个数据中200所在的下标
//调用方法
int index = binarySearch(arr,200);
System.out.println(index==-1?"该元素不存在!":"该元素下标”+index);
}
// dest 目标元素
//-1表示该元素不存在,其他表示返回该元素的下标
public static void binarySearch(int[] arr,int dest){
//开始下标
int begin = 0;
//结束下标
int end = arr.length-1;
//开始元素的下标只要在结束元素下标的左边,就有机会继续循环
while(begin<=end){
//中间元素下标
int mid = (begin+end)/2;
if(arr[mid]==dest){
return mid;
}else if(arr[mid]<dest){
//目标在“中间”的右边
//开始元素下标需要发生变化(开始元素的下标需要重新赋值)
begin = mid +1; //一直加
}else{
//arr[mid]>dest
//目标在“中间”的左边
//修改结束元素的下标
end = mid -1; //一直减
}
}
return -1;
}
二分法查找原理
10(下标是0) 23 56 89 100 111 222 235 500 600(下标9)arr数组
目标:找出600的下标
(0+9)/2-->4(中间元素的下标)
arr[4]这个元素就是中间元素:arr[4]是100
100<600
说明被查找的元素在100的右边
那么此时开始下标变成:4+1
(5+9)/2-->7(中间元素的下标)
arr[7]对应的值是:235
235<600
说明被查找的元素在235的右边
开始下标有进行了转变:7+1
(8+9)/2-->8
arr[8]-->500
500<600
开始元素的下标又发生了变化:8+1
(9+9)/2-->9
arr[9]是600,正好和600相等,此时找到了
相关文章:
几种常见的算法
一、冒泡排序法 冒泡排序法 原始数据:3 2 7 6 8 第1次循环:(最大的跑到最右边) 2 3 7 6 8(3和2比较,2<3 所以2和3交换位置) 2 3 7 6 8(3和7比较,3<7 所以不需要交…...
原生的cURL函数而不是 tp6框架的Http类,curl_init()、curl_setopt()和curl_exec()等cURL函数
GET请求示例: // 初始化 cURL $ch curl_init(); // 设置 cURL 选项 curl_setopt($ch, CURLOPT_URL, https://example.com/api/resource); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 执行 cURL 并获取返回结果 $response curl_exec($ch); // 关闭 cURL…...

Win10下在Qt项目中配置SQlite3环境
资源下载 官网资源:SQLite Download Page 1、sqlite.h sqlite-amalgamation-3450000.zip (2.60 MiB) 2、sqlite3.def,sqlite3.dll sqlite-dll-win-x64-3450000.zip (1.25 MiB) 3、 win10下安装sqlite3所需要文件 sqlite-tools-win-x64-3450000.zipht…...

Sentinel 轨道数据及下载
Sentinel卫星轨道文件在处理Sentinel卫星数据时发挥着关键作用。这些轨道文件包含了有关卫星在轨道上的运动、位置、姿态等信息,对于地理校正、成像几何校正以及多时相分析等方面具有重要作用。以下是Sentinel卫星轨道文件的主要作用: 地理校正ÿ…...
MD5 加密
任务: 接到一个任务,调用对方的接口,内容和密码,需要使用md5进行加密,再发送请求。 参数说明: 参数名称 说明 备注 timespan 时间戳 格式为yyyyMMddHHmmss pwd 密码 此处用原始密码时间戳做MD5加…...
在 Excel 中将列数据用单引号括起来并添加分隔符的解决方案
在 Excel 中,有时候我们需要将某一列的所有值连接在一起,并且每个值用单引号括起来,同时在每个值之间添加逗号和空格。这样的需求在数据处理和导出时比较常见。本文将介绍一种使用 Excel 函数解决这个问题的方法。 解决方案: 方…...

技术硬实力,阿里巴巴为什么要开源Spring Cloud Alibaba?
Spring Cloud Alibaba是阿里巴巴开源的一款高性能的微服务RPC框架,关于Spring Cloud Alibaba的详细介绍我这里就不啰嗦了,大家可以参考官网及相关源码,我这里只是想聊的是“阿里巴巴为什么要开源Spring Cloud Alibaba”,只要追根朔…...

2024 前端高频面试题之 HTML/CSS 篇
【前言】随着市场的逐渐恶劣,通过总结面试题的方式来帮助更多的coder,也是记录自己的学习过程,温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化?2、块级元素&内联样式3、盒子模型的理解&…...
实现将信息作为txt,pdf,图片的形式保存到电脑~
PrintableUtils作为输出信息的工具类: package org.example; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.pdf.PdfWriter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; im…...

服务器变矿机,该如何应对?
开始 恶意的挖矿程序会导致服务器cpu的异常占用,很让人讨厌。起初,我只是使用top命令显示出占用cpu不正常的进程,发现其中一个进程占用了百分之九十九点几,然后通过kill -9 <PID>命令干掉它。但总是过不了几天,…...

2018年认证杯SPSSPRO杯数学建模A题(第一阶段)海豚与沙丁鱼全过程文档及程序
2018年认证杯SPSSPRO杯数学建模 探究海豚猎捕时沙丁鱼群的躲避运动模型 A题 海豚与沙丁鱼 原题再现: 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗,所以在距离较远时,海豚只能使用回声定位方法来判断鱼群的整体位置…...
【Webpack】预处理器 - 常用loader介绍
选用合适的loader来处理不同的资源和不同的功能,以下是一些主流的loader,但这并不是全部,因为每时每刻都可能有新的loader 发布到 npm上 babel-loader babe-loader 用来处理ES6并将其编译为ESS,它使我们能够在最新的工程中使用最…...
lodash 的 _.groupBy 函数是怎么实现的?
说在前面 🎈lodash的_.groupBy函数可以将一个数组按照给定的函数分组,返回一个新对象。该函数接收两个参数:第一个参数是要进行分组的数组,第二个参数是用于分组的函数。该函数会对数组中的每个元素进行处理,返回一个值…...

(2024,ViM,双向 SSM 骨干,序列建模)利用双向状态空间模型进行高效视觉表示学习
Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0.摘要 3. 方法 3.1. 基础知识 3.…...

docker容器和常用命令
1.什么是容器 容器是隔离的环境中运行的一个 进程 , 如果进程结束 , 容器就会停止. 细致: 容器的隔离环境 , 拥有自己的 ip 地址 , 系统文件 , 主机名 , 进程管理 , 相当于一个 mini的系统 2.容器 vs 虚拟机 3.Docker极速上手指南 #1.安装相关依赖. sudo yum install -y …...
【征服redis9】快速征服lua脚本
lua脚本,这个名字总让人想歪,不过老外发明名字,我们只能跟着叫了。这个脚本语言在redis里和Nginx里都有用,所以我们就来看一下。 目录 1 lua的介绍与说明 2 lua的基本语句体验 3.Lua的数据结构和高级特性 1 lua的介绍与说明 …...

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变
vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格: 子…...
GBASE南大通用分享,如何修改可信上下文
在以下示例中,假设该可信上下文对象 appserver 存在并启用。以下的 ALTER TRUSTED CONTEXT 语句将 appserver 可信上下文对象的对象方式重置为 DISABLE。当其处于该方式时, appserver 可信上下文仍然存在,但是它不能用于存取数据库服务器。 …...

冻结Prompt微调LM: T5 PET (a)
T5 paper: 2019.10 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer Task: Everything Prompt: 前缀式人工prompt Model: Encoder-Decoder Take Away: 加入前缀Prompt,所有NLP任务都可以转化为文本生成任务 T5论文的初衷如…...
119 BFS和DFS解二叉树的所有路径
问题描述:给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。 DFS求解:定义一个全局的链表,用来装所有的结果,通过DFS遍历,一旦遍历到当前节点没有子节点…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...